Python中是否有与Perl的"/x"修饰符等价的功能?
Perl 让我们很容易写出可读性强的正则表达式,这要归功于一个叫做 /x
的修饰符。这个修饰符的作用是让我们在写正则表达式的时候,可以忽略字符串中的所有空格。换句话说,我们可以用空格或者换行符把正则表达式的逻辑部分分开,这样就能让它看起来更清晰。在 Python 中,我看到的唯一方法是先写出这样的正则表达式字符串,然后在中间步骤中把空格去掉,最后用处理后的字符串进行匹配。有没有更优雅的方法呢?
2 个回答
3
补充一下,内联修饰符可以放在正则表达式中,用来强制规定匹配的行为。在Python中,内联修饰符会影响整个正则表达式,并且不支持像 (?-ismx)
这样的内联否定修饰符。
pattern = re.compile(r'''
(?x)
\d+ (?# Some numbers)
\s+ (?# Whitespace)
\d+ (?# More numbers)
''');
解决这个问题的方法是导入Python的regex模块,在这个模块中,内联修饰符可以应用到组或模式的末尾,并且可以随时开启或关闭。
import regex
pattern = regex.compile(r'(?x) \d+ (?-x)[a-z]+(?x) \d+', regex.V1)
11
是的,你可以通过设置 re.X
/ re.VERBOSE
标志 来实现:
这个标志让你写的正则表达式看起来更整洁。模式中的空格会被忽略,除了在字符类中,或者在前面有未转义的反斜杠时,或者在像
*?
、(?:
或(?P<...>
这样的标记中。当一行中出现一个#
,并且它不在字符类中且前面没有未转义的反斜杠时,从这个#
开始到行末的所有字符都会被忽略。这意味着,下面这两个匹配小数的正则表达式对象在功能上是相同的:
a = re.compile(r"""\d + # the integral part \. # the decimal point \d * # some fractional digits""", re.X) b = re.compile(r"\d+\.\d*")
这和 Perl 中的 /x
标志几乎是一样的。
你还可以在模式的子部分中控制同样的标志,使用 (?x:...)
(启用)和 (?-x:...)
(禁用)这样的分组。