在Python中匹配先前定义的组

3
这个问题是关于在Python中匹配先前定义的组,但实际上并不那么简单。
这是我想要匹配的文本:
Figure 1: Converting degraded weaponry to research materials.

Converting degraded weaponry to research
materials.

这是我的正则表达式:

(Figure )(\d)(\d)?(: )(?P<description>.+)(\n\n)(?P=description)

现在,我当前所拥有的问题是正则表达式无法匹配文本,因为第三行的“research”后面出现了换行符。我希望Python在匹配前一个组与我的字符串时忽略换行符。


据我所知,在标准正则表达式中没有这种功能。尝试使用Python的模糊匹配。 - FrankieTheKneeMan
1
我相信你可以使用 re.MULTILINE 来完成这个任务。看看这个链接是否有帮助:https://dev59.com/cXRB5IYBdhLWcg3wj36c - Hoopdady
很遗憾,仅仅启用 re.MULTILINE 并没有起到帮助作用。 - xaav
@Hoopdady 不是的,re.MULTILINE 只会导致 ^$ 锚点在每一行的开头和结尾匹配,而不是只在字符串的开头和结尾匹配。http://docs.python.org/2/library/re.html#module-contents - FrankieTheKneeMan
1
你必须以某种方式规范化文本,才能使这种匹配起作用。一种可能性是使用 textwrap - jhermann
1个回答

0

这似乎有两种常见的方法:一种是规范化文本(如jhermann建议的),另一种是针对每个可能的匹配运行一个函数/代码片段,并进行比单个正则表达式更复杂的比较。

规范化:

text = re.sub(r"\n\n", somespecialsequence, text);
text = re.sun(r"\s*\n", " ", text);
text = re.sub(r"\s+", " ", text);
text = re.sub(somespecialsequence, "\n\n", text);

现在,这应该按预期工作:(图 )(\d)(\d)?(: )(?P<description>.+)(\n\n)(?P=description) 或者,使用代码片段:
matches = re.finditer(r"(Figure )(\d+)(: )(.+)(\n\n)(.+)(?=Figure )", text, flags=re.S)
for m in matches:
    text1 = m.group(4)
    text2 = m.group(6)
    text1 = re.sub("\W+", " ", text1)
    text2 = re.sub("\W+", " ", text2)
    if (text1 == text2):
        // this is a match

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接