Perl可以使用/x
修饰符轻松构建readable regular expressions。此修饰符允许编写正则表达式字符串并忽略这些字符串中的所有空格。换句话说,正则表达式的逻辑部分可以用空格或甚至回车分隔,从而提供了很好的可读性。在Python中,我看到这样做的唯一方法是构造这样的正则表达式字符串,在中间步骤中从中删除空格,然后使用生成的字符串进行匹配。有更优雅的方式吗?
答案 0 :(得分:8)
是的,通过设置re.X
/ re.VERBOSE
flag:
此标志允许您编写看起来更好的正则表达式。除非在字符类中,或者在未转义的反斜杠之前,或在
*?
,(?:
或(?P<...>
之类的标记内,否则将忽略模式中的空格。当一行包含一个不在字符类中的#
并且前面没有未转义的反斜杠时,将忽略从最左边的#
到该行末尾的所有字符。这意味着匹配十进制数的以下两个正则表达式对象在功能上是相同的:
a = re.compile(r"""\d + # the integral part \. # the decimal point \d * # some fractional digits""", re.X) b = re.compile(r"\d+\.\d*")
这与/x
Perl标志非常相似。
您可以在(?x:...)
(启用)和(?-x:...)
(禁用)分组中控制模式子节中的相同标记。
答案 1 :(得分:3)
要添加,可以将内联修饰符放在正则表达式中,以对给定表达式强制执行相关的匹配行为。在Python中,内联修饰符适用于整个正则表达式,并且不支持内联否定修饰符,例如(?-ismx)
pattern = re.compile(r'''
(?x)
\d+ (?# Some numbers)
\s+ (?# Whitespace)
\d+ (?# More numbers)
''');
解决方法是导入Python的正则表达式模块,其中内联修饰符适用于组或模式的末尾,并且可以打开或关闭它们。< / p>
import regex
pattern = regex.compile(r'(?x) \d+ (?-x)[a-z]+(?x) \d+', regex.V1)