Python中是否有与Perl的"/x"修饰符等价的功能?

10 投票
2 回答
1150 浏览
提问于 2025-04-18 10:25

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:...)(禁用)这样的分组。

撰写回答