查看: 1276|回复: 21
打印 上一主题 下一主题

[求助] 请教正则表达式去除重复内容

[复制链接]

该用户从未签到

3

主题

235

回帖

5070

积分

会元

Rank: 7Rank: 7Rank: 7

积分
5070
跳转到指定楼层
1
发表于 2019-4-26 14:52:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dongzhi1980 于 2019-4-26 14:56 编辑

要处理内容如下:

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

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


本帖被以下淘专辑推荐:

  • TA的每日心情
    擦汗
    前天 07:00
  • 签到天数: 1090 天

    [LV.10]以坛为家III

    124

    主题

    1772

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    10477

    灌水大神章小蜜蜂章笑傲江湖章

    推荐
    发表于 2019-4-26 15:58:47 | 只看该作者
    这个已经在正则能力之外了,正则的能力是很有限的。你这一类用awk处理应该很方便。具体需要可查手册。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

    灌水大神章笑傲江湖章推广专家QQ 章

    推荐
    发表于 2019-4-26 15:07:31 | 只看该作者

    该用户从未签到

    539

    主题

    3046

    回帖

    25万

    积分

    翰林院编修

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    251476

    翰林院专用章灌水大神章笑傲江湖章小蜜蜂章管理组专用章

    2
    发表于 2019-4-26 15:01:20 | 只看该作者
    你可以直接贴进excel,用空格分隔,然后删掉右边的数据就好了

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    4
     楼主| 发表于 2019-4-26 15:19:11 | 只看该作者
    klwo2 发表于 2019-4-26 15:01
    你可以直接贴进excel,用空格分隔,然后删掉右边的数据就好了

    因为文件较大,右侧重复的数据又不是相邻的单元格,各行长度不一,所以,不知道在Excel中如何处理,能详细些吗?
  • TA的每日心情
    奋斗
    2021-9-28 10:33
  • 签到天数: 314 天

    [LV.8]以坛为家I

    4

    主题

    568

    回帖

    5563

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5563
    5
    发表于 2019-4-26 15:20:29 | 只看该作者
    jonah_w 发表于 2019-4-26 15:07
    https://regex101.com/r/dTixFz/1

    这是个好东西。

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    6
     楼主| 发表于 2019-4-26 15:26:43 | 只看该作者
    本帖最后由 dongzhi1980 于 2019-4-26 15:53 编辑

    谢谢你。你链接的程序应该能处理,请问为什么我粘贴进去的(或者在里面直接写进去)的重复内容不能自动去重?


  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

    灌水大神章笑傲江湖章推广专家QQ 章

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

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

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

    点评

    你这次给出的链接,可以通过反复粘贴的方法解决去除所有的重复项,谢谢!  发表于 2019-4-26 16:18

    评分

    1

    查看全部评分

  • TA的每日心情
    郁闷
    2018-5-17 09:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    56

    主题

    490

    回帖

    1万

    积分

    分区版主

    Rank: 11Rank: 11Rank: 11Rank: 11

    积分
    12730

    翰林院专用章灌水大神章笑傲江湖章小蜜蜂章管理组专用章

    9
    发表于 2019-4-26 22:22:07 | 只看该作者
    本帖最后由 y8888 于 2019-4-27 07:43 编辑

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

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


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


    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    10
     楼主| 发表于 2019-4-27 10:36:27 | 只看该作者
    jonah_w 发表于 2019-4-26 15:07
    https://regex101.com/r/dTixFz/1

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


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


    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    11
     楼主| 发表于 2019-4-27 10:39:39 | 只看该作者
    y8888 发表于 2019-4-26 22:22
    用Em查找输入 ^(.*[a-z] [[:unicode:]].*?) .*
    替换中输入\1

    谢谢你,我想要的是“对于重复出现的项,只保留第一次出现的一项,其他内容不变“。可能是我没表达清楚,不好意思。
  • TA的每日心情
    奋斗
    2019-4-14 02:12
  • 签到天数: 93 天

    [LV.6]常住居民II

    250

    主题

    2966

    回帖

    53万

    积分

    状元

    吃水不忘挖井人

    Rank: 9Rank: 9Rank: 9

    积分
    531111

    灌水大神章笑傲江湖章推广专家QQ 章

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

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

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    13
     楼主| 发表于 2019-4-27 10:47:12 | 只看该作者
    本帖最后由 dongzhi1980 于 2019-4-27 10:54 编辑

    谢谢,闪电般的答复。经验证,你的正则可以移植到Emeditor里,效果更好。

    该用户从未签到

    2

    主题

    160

    回帖

    2971

    积分

    解元

    Rank: 5Rank: 5

    积分
    2971

    灌水大神章

    14
    发表于 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.

    awkit.png (19.66 KB, 下载次数: 1)

    awkit.png

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    15
     楼主| 发表于 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 ...

    谢谢你,感觉为了一个功能应用去学一门语言有点过了。
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    16
    发表于 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有可能支持肯定型逆序环视,没试过

    评分

    1

    查看全部评分

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    17
     楼主| 发表于 2019-4-29 15:39:31 | 只看该作者
    mikeee 发表于 2019-4-29 10:16
    一qq群友给的答案:

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

    你看自己发的链接了吗,替换前后有何不同?
  • TA的每日心情
    开心
    2019-8-21 08:44
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    393

    回帖

    1万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    14980
    18
    发表于 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 看看

    替换后
    1. Chinese 中文 汉语 中国人 华侨 中国人的
    2. American 美国人 美国公民 美国人的 美国的
    复制代码


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

    评分

    1

    查看全部评分

  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    43

    主题

    391

    回帖

    5万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    54723
    19
    发表于 2019-4-29 17:47:42 | 只看该作者
    mikeee 发表于 2019-4-29 10:16
    一qq群友给的答案:

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

    这个例子让我对regex look around有了更进一步的理解,前一阵子学习的时候就这一部分理解有问题,太感谢您和这位群友了!
  • TA的每日心情
    开心
    2019-6-23 00:02
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    43

    主题

    391

    回帖

    5万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    54723
    20
    发表于 2019-4-29 17:54:13 | 只看该作者
    mikeee 发表于 2019-4-29 10:16
    一qq群友给的答案:

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

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

    该用户从未签到

    3

    主题

    235

    回帖

    5070

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5070
    21
     楼主| 发表于 2019-4-29 21:46:25 | 只看该作者

    如你所说,一次成型,牛,Chorme下通过,Firefox失效