正则表达式删除多行字符串中的重复短语
Regex remove duplicate phrases in multiline string
问题是什么:
我有一个多行文本,例如:
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
g
和 m
):
^([^\r\n]*)$(.*?)(?:(?:\r?\n|\r))+$
看这里:regexr.com/5nklg
和
^(.*)(?:\r?\n|\r)(?=[\s\S]*^$)
看这里:regexr.com/5nkla
它们都产生不同的输出,都很好,但并不完美。
我想达到的目标:
删除文本中所有重复的短语,但保留一个。例如,这里保留第一个“这是我的应用程序的测试字符串”。从第 1 行开始,在第 2 - 9 行匹配相同的短语并保留数字 10。
如果我可以保留最后一个而不是第一个匹配短语,它对我也有用。所以这里是匹配行 1 - 8,保留 9 和 10。
有没有办法用正则表达式做到这一点?
仅供参考:稍后我将在 python 中使用正则表达式来分出重复项:
re.sub(r"^(.*)(?:\r?\n|\r)(?=[\s\S]*^$)", "", my_text, flags=re.MULTILINE)
编辑: a 'phrase' 表示让我们说 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
提前致谢!
您可以使用
re.sub(r'^(([^\n\r.]*).*)(?:(?:\r?\n|\r).*)*', r'', my_text, flags=re.M)
参见regex demo。
详情:
^
- 行首(由于使用了 re.M
选项,^
现在匹配行首位置)
(([^\n\r.]*).*)
- 第 1 组:除点、CR 和 LF 之外的零个或多个字符捕获到第 2 组,然后是行的其余部分
(?:(?:\r?\n|\r).*)*
- 零个或多个序列
(?:\r?\n|\r)
- CRLF、CR 或 LF 行结尾
</code> - 与第 2 组中的文字相同</li>
<li><code>.*
- 该行的其余部分。
替换为第 1 组值。
问题是什么:
我有一个多行文本,例如:
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
g
和 m
):
^([^\r\n]*)$(.*?)(?:(?:\r?\n|\r))+$
看这里:regexr.com/5nklg
和
^(.*)(?:\r?\n|\r)(?=[\s\S]*^$)
看这里:regexr.com/5nkla
它们都产生不同的输出,都很好,但并不完美。
我想达到的目标:
删除文本中所有重复的短语,但保留一个。例如,这里保留第一个“这是我的应用程序的测试字符串”。从第 1 行开始,在第 2 - 9 行匹配相同的短语并保留数字 10。
如果我可以保留最后一个而不是第一个匹配短语,它对我也有用。所以这里是匹配行 1 - 8,保留 9 和 10。
有没有办法用正则表达式做到这一点?
仅供参考:稍后我将在 python 中使用正则表达式来分出重复项:
re.sub(r"^(.*)(?:\r?\n|\r)(?=[\s\S]*^$)", "", my_text, flags=re.MULTILINE)
编辑: a 'phrase' 表示让我们说 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
提前致谢!
您可以使用
re.sub(r'^(([^\n\r.]*).*)(?:(?:\r?\n|\r).*)*', r'', my_text, flags=re.M)
参见regex demo。
详情:
^
- 行首(由于使用了re.M
选项,^
现在匹配行首位置)(([^\n\r.]*).*)
- 第 1 组:除点、CR 和 LF 之外的零个或多个字符捕获到第 2 组,然后是行的其余部分(?:(?:\r?\n|\r).*)*
- 零个或多个序列(?:\r?\n|\r)
- CRLF、CR 或 LF 行结尾</code> - 与第 2 组中的文字相同</li> <li><code>.*
- 该行的其余部分。
替换为第 1 组值。