如何在包含有意义空白符的情况下编写与re.VERBOSE一起使用的模式?

8

当使用re.VERBOSE时,包含有意义空格的正则表达式会出现错误,显然是因为re.VERBOSE“有用地”魔法般地消除了“问题摘要”中所有有意义的空格,以及所有恶心的非有意义空格(例如(多行)模式内部的填充和换行符)。 (我的多行正则表达式使用re.VERBOSE是不可协商的 - 这实际上是一个巨大的多行正则表达式的巨大简化,其中re.VERBOSE仅仅是为了保持理智而必需的。)

import re
re.match(r'''Issue Summary.*''', 'Issue Summary: fails''', re.U|re.VERBOSE)
# No match!
re.match(r'''Issue Summary.*''', 'Issue Summary: passes''', re.U)
<_sre.SRE_Match object at 0x10ba36030>
re.match(r'Issue Summary.*', 'Issue Summary: passes''', re.U)
<_sre.SRE_Match object at 0x10b98ff38>

有没有更好的方法来编写支持re.VERBOSE的正则表达式模式,包含有意义的空格,而不是在模式中用 '\s' 或 '.' 替换每个实例,这种写法不仅丑陋,而且不直观且难以自动化处理?

re.match(r'Issue\sSummary.*''', 'Issue Summary: fails', re.VERBOSE)
<_sre.SRE_Match object at 0x10ba36030>
re.match(r'Issue.Summary.*''', 'Issue Summary: fails', re.VERBOSE)
<_sre.SRE_Match object at 0x10b98ff38>

(顺便说一句,这是Python 2和3中一个有用的文档错误。我会在这里得到共识后提交它)

为什么要使用三重引号?它们没有帮助,反而会使字符串变得模糊。r'''abc''' 只是 r'' + 'abc' + '' 或者 'abc'。因为 r 在初始空字符串后就结束了,所以它甚至没有起到作用。 - Tom Karzes
@TomKarzes:正如我在问题中明确指出的那样,“这实际上是一个巨大的多行正则表达式的大幅简化”。真正的正则表达式实际上有14行,并且还在不断增长。它具有多个嵌套子表达式。所以,就像我说的那样,多行模式和re.VERBOSE是不可谈判的。 - smci
1
好的 - 只是通过将它们变成单行,引号的含义已经改变了。 - Tom Karzes
@TomKarzes:啊,你说得对。原始多行字符串应该是这样的:r"""this is right""",而不是r'''this is wrong'''。请参见如何在Python中正确编写原始多行字符串?。我的误解是因为其他人多年来一直在传播同样的错误。相关链接:Python regex compile (with re.VERBOSE) not working - smci
@smci 不是的。单引号和双引号是完全可以互换的。三个单引号或三个双引号,无论是否有前缀都是一样的。请参考语言参考这个问题 - Jeyekomon
1个回答

10

如果使用了re.VERBOSE,那么我认为除了改变正则表达式字符串之外没有其他选择。然而,我建议采用以下其中一种方法:

r'abc\ def'
或:
r'abc[ ]def'

无论是r'\ '还是'[ ]'都匹配单个空格(不是任何空白字符,只有实际的空格)。请注意,如果没有前面的r,则反斜杠字符需要加倍,即\\


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