regex 如何替换重复的匹配项?

368yc8dk  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(127)

我想删除列表中所有段落的起始字符串(不区分大小写):["keyword", "disclosure"]
我的代码:

re.sub("(?i)\n(keyword|disclosure).*(\n|$)", "\n", txt)

如果两个坏段落之间至少有一个段落,则此方法可以正常工作,但如果一行中有多个坏段落,则此方法不起作用。
举例来说:

Text text text
Keywords: text text, text. Texts
Disclosures of stuff text more texts
Stuff text text

导致后面的坏段落被错过:

Text text text
Disclosures of stuff text more texts
Stuff text text

而不是我想看到的:

Text text text
Stuff text text

我如何确保所有重复的匹配也被替换?最好我也喜欢重复的匹配作为相同的匹配,所以我没有得到额外的换行符,但如果它更干净,更容易只是替换重复的换行符后,这是确定的。

yftpprvb

yftpprvb1#

比赛开始和结束时的'\n'在连续的比赛中彼此重叠。相反,使用^来匹配开头,这也将涵盖字符串以您想要删除的段落开头的情况。它需要标志MULTILINE才能工作。然后,替换字符串变为空字符串。

import re

txt = '''\
Text text text
Keywords: text text, text. Texts
Disclosures of stuff text more texts
Stuff text text'''

result = re.sub("(?im)^(keyword|disclosure).*(\n|$)", "", txt)
print(result)
Text text text
Stuff text text
rjee0c15

rjee0c152#

import re

txt = """
Text text text
Keywords: text text, text. Texts
Disclosures of stuff text more texts
Stuff text text
"""

keywords = ["keyword", "disclosure"]

pattern = "(?i)^(" + "|".join(keywords) + ").*?(\n|$)"
result = re.sub(pattern, "", txt, flags=re.MULTILINE)

print(result)

输出

Text text text
Stuff text text
3npbholx

3npbholx3#

使用re.MULTILINE(即(?m))和^/$锚:

import re

txt = """
Text text text
Keywords: text text, text. Texts
Disclosures of stuff text more texts
Stuff text text
"""

print(re.sub("(?mi)^(keyword|disclosure).*$", "", txt))

打印出

Text text text

Stuff text text

如果需要的话,你可以清除多个换行符(因为这将用一个空字符串替换整行)。

相关问题