【问题标题】:Regex remove duplicate phrases in multiline string正则表达式删除多行字符串中的重复短语
【发布时间】:2021-05-31 21:37:45
【问题描述】:

有什么问题:

我有一个多行文本,例如:

1: This is test string for my app. d
2: This is test string for my app.
3: This is test string for my app. abcd
4: This is test string for my app.
5: This is test string for my app.
6: This is test string for my app.
7: This is test string for my app. d
8: This is test string for my app.
9: This is test string for my app.
10: This is another string.

这里的行号只是为了更好的可视化,它们不是文本本身的一部分。

我尝试过的:

我尝试了两种不同的正则表达式(标志总是:i gm):

^([^\r\n]*)$(.*?)(?:(?:\r?\n|\r)\1)+$

请看这里:regexr.com/5nklg

^(.*)(?:\r?\n|\r)(?=[\s\S]*^\1$)

请看这里:regexr.com/5nkla

它们都产生不同的输出,都很好,但并不完美。

我想要达到的目标:

删除文本中所有重复的短语,但保留一个。所以这里例如保留第一个“这是我的应用程序的测试字符串”。从第 1 行开始,匹配第 2 - 9 行的相同短语并保留数字 10。

如果我可以保留最后一个而不是第一个匹配的短语,它也会对我有用。所以这里将匹配第 1 - 8 行,保留 9 和 10。

有没有办法用正则表达式做到这一点?

仅供参考:稍后我将在 python 中使用正则表达式来删除重复项:

re.sub(r"^(.*)(?:\r?\n|\r)(?=[\s\S]*^\1$)", "", my_text, flags=re.MULTILINE)

编辑:“短语”意味着让我们说 3 个或更多单词。所以匹配任何超过 2 个单词的重复项。所以第一个 sub 之后的预期输出是:

This is test string for my app. d  //from line 1
This is test string for my app.    //from line 2
abcd                               //from line 3
This is another string.            //from line 10

提前致谢!

【问题讨论】:

  • This is test string for my app. abcd 也是重复的吗?
  • 您的意思是要识别直到行的第一个句点的重复行? ^([^\n\r.]*)\..*(?:\r?\n|\r)(?=[\s\S]*^\1\..*$)?见demo。 (或者,如果该行其余部分的点是可选的,^([^\n\r.]*)(?:\..*)?(?:\r?\n|\r)(?=[\s\S]*^\1(?:\..*)?$)
  • @anubhava 只有其中的重复短语:“这是我的应用程序的测试字符串。” abcd 可以留下来。只需在此字符串中复制短语即可。不管结尾是换行还是句号
  • 好的,试试re.sub(r'^(([^\n\r.]*).*)(?:(?:\r?\n|\r)\2.*)*', r'\1', my_text, flags=re.M),见this regex demo
  • @G43beli:能否请您展示您的预期输出?

标签: python regex eda


【解决方案1】:

你可以使用

re.sub(r'^(([^\n\r.]*).*)(?:(?:\r?\n|\r)\2.*)*', r'\1', my_text, flags=re.M)

请参阅regex demo

详情

  • ^ - 行首(由于使用了re.M 选项,^ 现在匹配行首位置)
  • (([^\n\r.]*).*) - 第 1 组:除点之外的零个或多个字符、CR 和 LF 被捕获到第 2 组,然后是该行的其余部分
  • (?:(?:\r?\n|\r)\2.*)* - 零个或多个序列
    • (?:\r?\n|\r) - CRLF、CR 或 LF 行结尾
    • \2 - 与第 2 组中的文本相同
    • .* - 该行的其余部分。

替换的是第 1 组的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多