正则表达式中 {m,n} 重复的空间问题

4
最近我在写一个Python程序,但是出现了一个bug,我花了一个多小时解决问题,最终发现正则表达式是问题所在。我不知道在模式M{m,n}mn之间必须没有空格,而我将其写成了M{m, n},导致代码无法执行。

我查看了http://docs.python.org/3/library/re.html关于{m,n}部分的内容,它没有说明在{m,n}mn之间不能放置空格。为什么呢?还有其他微小的事情文档没有提到,我应该了解正则表达式吗?


2
通常文档只列出您可以做的事情,并不尝试迭代所有可能的错误方法。;-) - Qtax
1
我认为CodyChan所描述的问题是文档中指出,当使用verbose标志时,“模式内的空格将被忽略,除非它们在字符类中或者前面没有转义的反斜杠”。他示例中的空格既没有被转义也不在字符类中,而是作为量词的一部分。因此,文档似乎是错误的。 - JonM
@JonM:Qtax是正确的;即使在自由空间模式下,空格也只能占据本来就合法的位置。按照您的推理,(?:foo)可以在自由空间模式下写成(? :foo),并仍然被识别为非捕获组。 - Alan Moore
@Alan Moore - 不是我的推理。我是说Python的文档误导人。而且你的例子 (?x)(? :foo) 在某些正则表达式的实现中是有效的(比如Java)。 - JonM
Java在自由空格模式下出了名的有bug,但我直到现在才意识到它有多糟糕。它允许您在任何地方放置空格。无论是否处于自由空格模式,(?:...){2,4}应始终被视为语法错误,并且[123 xyz]中的空格应始终匹配空格字符。 - Alan Moore
3个回答

4
您不会找到任何记录这个的文件,但这源于正则表达式的本质,因为正则表达式中的每个字符都有特殊含义,并且它在使用的上下文中可能具有不同的含义。因此,一些语言支持一个通常称为自由间距模式的标志,允许您使用空格编写正则表达式,以提高可读性和可维护性,同时允许您在正则表达式本身中包含注释。简而言之,正则表达式中的每个字符和符号都很重要,因此不要假设某些内容无关紧要或可以像平常一样传递。

0

我一开始确实像你那样在re.compile的末尾加上了re.VERBOSE(或re.X),但空格仍然导致了问题。 - CodyChan
啊,是的,你说得对!我刚刚测试了一下,在使用了你所说的详细模式之后,它并不喜欢范围量词中的空格。我没有意识到你已经尝试过使用详细模式了。 - JonM
请告诉@JonM,re.VERBOSE用于忽略空格(例如"(D?C{0,3}) (XL|L?X{0,3})"中的空格,而不是{0, 3}中的空格)和注释,请查看http://www.diveinto.org/python3/regular-expressions.html#verbosere以获取详细信息。 - CodyChan

0

这是正确的行为。范围量词({n,m})和字符类([xyz])被视为原子单位;自由空间模式对它们没有影响。在字符类中,空格字符仍然匹配字面空格,在范围量词中,它仍然是语法错误。例如,Java将{3, 5}视为语法错误,因为大括号未转义,但在Python中,它匹配字面序列{3, 5}


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