dongzhi1980 发表于 2019-4-26 14:52:39

请教正则表达式去除重复内容

本帖最后由 dongzhi1980 于 2019-4-26 14:56 编辑

要处理内容如下:

Chinese 中文 汉语 中国人 中文 华侨 中文 中国人的
American 美国人 美国公民 美国人 美国人的 美国的

全文不一一列举,请问,如何用正则处理第一行使结果中只保留第一个“中文”,其他不变,第二行类似,只保留第一个“美国人”而其他不变。烦请解释处理的过程。谢谢!


spoony1971 发表于 2019-4-26 15:58:47

这个已经在正则能力之外了,正则的能力是很有限的。你这一类用awk处理应该很方便。具体需要可查手册。

jonah_w 发表于 2019-4-26 15:07:31

https://regex101.com/r/dTixFz/1

klwo2 发表于 2019-4-26 15:01:20

你可以直接贴进excel,用空格分隔,然后删掉右边的数据就好了

dongzhi1980 发表于 2019-4-26 15:19:11

klwo2 发表于 2019-4-26 15:01
你可以直接贴进excel,用空格分隔,然后删掉右边的数据就好了
因为文件较大,右侧重复的数据又不是相邻的单元格,各行长度不一,所以,不知道在Excel中如何处理,能详细些吗?

alredstone 发表于 2019-4-26 15:20:29

jonah_w 发表于 2019-4-26 15:07
https://regex101.com/r/dTixFz/1

这是个好东西。{:4_97:}

dongzhi1980 发表于 2019-4-26 15:26:43

本帖最后由 dongzhi1980 于 2019-4-26 15:53 编辑

jonah_w 发表于 2019-4-26 15:07
https://regex101.com/r/dTixFz/1
谢谢你。你链接的程序应该能处理,请问为什么我粘贴进去的(或者在里面直接写进去)的重复内容不能自动去重?
https://i.loli.net/2019/04/26/5cc2b8dbf29e0.jpg

jonah_w 发表于 2019-4-26 15:55:01

dongzhi1980 发表于 2019-4-26 15:26
谢谢你。你链接的程序应该能处理,请问为什么我粘贴进去的(或者在里面直接写进去)的重复内容不能自动去 ...

一行最后留一个空格就好了

或者这样也可以
https://regex101.com/r/dTixFz/4

y8888 发表于 2019-4-26 22:22:07

本帖最后由 y8888 于 2019-4-27 07:43 编辑

用Em查找输入 ^(.* [[:unicode:]].*?) .*
替换中输入\1

见图,这种是保留英文及一个中文是不是你想要的这种结果?


如果只要第一出现的中文则
查找输入^(.* )([[:unicode:]].*?) .*
替换中输入\2


dongzhi1980 发表于 2019-4-27 10:36:27

jonah_w 发表于 2019-4-26 15:07
https://regex101.com/r/dTixFz/1

你好,你的答案还能再完善一下吗,第二次替换时有点问题,谢谢
第一次时没有问题


第二次时,替换掉了不该替换的内容


dongzhi1980 发表于 2019-4-27 10:39:39

y8888 发表于 2019-4-26 22:22
用Em查找输入 ^(.* [[:unicode:]].*?) .*
替换中输入\1



谢谢你,我想要的是“对于重复出现的项,只保留第一次出现的一项,其他内容不变“。可能是我没表达清楚,不好意思。

jonah_w 发表于 2019-4-27 10:40:12

dongzhi1980 发表于 2019-4-27 10:36
你好,你的答案还能再完善一下吗,第二次替换时有点问题,谢谢
第一次时没有问题



https://regex101.com/r/dTixFz/6

dongzhi1980 发表于 2019-4-27 10:47:12

本帖最后由 dongzhi1980 于 2019-4-27 10:54 编辑

jonah_w 发表于 2019-4-27 10:40
https://regex101.com/r/dTixFz/6
谢谢,闪电般的答复。经验证,你的正则可以移植到Emeditor里,效果更好。

csw016 发表于 2019-4-27 22:50:58

awk is one of the best tools, if not the best, to work with tabular data.
on the other hand, powerful it is, regular expression is overly used in the wrong places.

To solve your problem with awk,
awk '{for(i=3; i<=NF; i++) if($i==$2) $i = "" } { print }' 2nd-col.txt > 2nd-cleaned.txt

suppose 2nd-col.txt is your original file and 2nd-cleaned.txt is your cleaned file.
I've uploaded a screenshot, but I'm not sure whether it shows correctly.

dongzhi1980 发表于 2019-4-28 08:00:32

csw016 发表于 2019-4-27 22:50
awk is one of the best tools, if not the best, to work with tabular data.
on the other hand, powerf ...

谢谢你,感觉为了一个功能应用去学一门语言有点过了。

mikeee 发表于 2019-4-29 10:16:50

一qq群友给的答案:

\s(\S+)(?=\s)(?<=(.*\s\1){2})

https://regex101.com/r/ldXeDC/2

要求支持肯定型逆序环视,Javascript正则引擎支持肯定型逆序环视,python, php,perl的t正则引擎貌似都不支持肯定型逆序环视, notepad++、emeditor大致也不会支持肯定型逆序环视, eeditpad有可能支持肯定型逆序环视,没试过

dongzhi1980 发表于 2019-4-29 15:39:31

mikeee 发表于 2019-4-29 10:16
一qq群友给的答案:

\s(\S+)(?=\s)(?

你看自己发的链接了吗,替换前后有何不同?

mikeee 发表于 2019-4-29 16:59:36

本帖最后由 mikeee 于 2019-4-29 17:07 编辑

dongzhi1980 发表于 2019-4-29 15:39
你看自己发的链接了吗,替换前后有何不同?
用 Chrome 打开 https://regex101.com/r/ldXeDC/2 看看

替换后
Chinese 中文 汉语 中国人 华侨 中国人的
American 美国人 美国公民 美国人的 美国的

Edge不支持肯定型逆序环视。regex101会显示 pattern error。

ogrishman 发表于 2019-4-29 17:47:42

mikeee 发表于 2019-4-29 10:16
一qq群友给的答案:

\s(\S+)(?=\s)(?

这个例子让我对regex look around有了更进一步的理解,前一阵子学习的时候就这一部分理解有问题,太感谢您和这位群友了!

ogrishman 发表于 2019-4-29 17:54:13

mikeee 发表于 2019-4-29 10:16
一qq群友给的答案:

\s(\S+)(?=\s)(?

这个简直是regex look around的经典范例啊,越看越觉得写的太好了,收藏了!

dongzhi1980 发表于 2019-4-29 21:46:25

mikeee 发表于 2019-4-29 16:59
用 Chrome 打开 https://regex101.com/r/ldXeDC/2 看看

替换后

如你所说,一次成型,牛,Chorme下通过,Firefox失效
页: [1]
查看完整版本: 请教正则表达式去除重复内容