尝试理解正则表达式,我在重复部分:{m, n}
。
我有这段代码:
>>> p = re.compile('a{1}b{1, 3}')
>>> p.match('ab')
>>> p.match('abbb')
正如您所看到的,两个字符串都不匹配模式。为什么会这样?
答案 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
希望这会有所帮助......