为什么这个正则表达式不起作用({m,n})?

时间:2011-02-12 15:11:01

标签: python regex

尝试理解正则表达式,我在重复部分:{m, n}

我有这段代码:

>>> p = re.compile('a{1}b{1, 3}')
>>> p.match('ab')
>>> p.match('abbb')

正如您所看到的,两个字符串都不匹配模式。为什么会这样?

6 个答案:

答案 0 :(得分:9)

您不应在逗号后面加上空格,{1}是多余的。

答案 1 :(得分:6)

尝试

p = re.compile('a{1}b{1,3}')

......并注意空间。

答案 2 :(得分:3)

删除b中的额外空格。

变化:

p = re.compile('a{1}b{1, 3}')

为:

p = re.compile('a{1}b{1,3}')
                        ^   # no whitespace

一切都应该好。

答案 3 :(得分:3)

你看到一些re行为是非常“黑暗的角落”,就在一个错误(或两个)附近。

# Python 2.7.1
>>> import re
>>> pat = r"b{1, 3}\Z"
>>> bool(re.match(pat, "bb"))
False
>>> bool(re.match(pat, "b{1, 3}"))
True
>>> bool(re.match(pat, "bb", re.VERBOSE))
False
>>> bool(re.match(pat, "b{1, 3}", re.VERBOSE))
False
>>> bool(re.match(pat, "b{1,3}", re.VERBOSE))
True
>>>

换句话说,模式"b{1, 3}"在正常模式下与文字文本"b{1, 3}"匹配,在VERBOSE模式下与文字文本"b{1,3}"匹配。

“最小惊讶法则”建议(1)3前面的空格被忽略,并与"b""bb""bbb"匹配适当的[优选]或(2)编译时的例外情况。

以另一种方式看待:两种可能性:(a)写"{1, 3}"的人充满了PEP8的精神,并认为它是规范性的并适用于所有地方(b)写作的人已经测试{ {1}}未记录的行为,实际上希望与文字re匹配,并且反过来希望使用"b{1, 3}"而不是显式转义:r"b{1, 3}"。在我看来,(a)比(b)更可能,r"b\{1, 3}"应该采取相应的行动。

另一个视角:当达到空间时,它已经解析了re,一串数字,以及一个逗号,即{“运算符”...以静默忽略意想不到的性格,并将其视为文字文本是令人难以置信的,perlish等。

更新 Bug report已提交。

答案 4 :(得分:2)

请勿在{{1​​}}和{之间插入空格。

}

答案 5 :(得分:1)

您可以使用VERBOSE标志编译正则表达式,这意味着将忽略正则表达式中的大多数空格。我认为以更易读的方式描述复杂的正则表达式是一种非常好的做法。

有关详细信息,请参阅here

希望这会有所帮助......