试图理解正则表达式,我在重复部分:{m, n}
。为什么这个正则表达式不起作用({m,n})?
我有这样的代码:
>>> p = re.compile('a{1}b{1, 3}')
>>> p.match('ab')
>>> p.match('abbb')
正如你可以看到这两个字符串不匹配模式。这是为什么发生?
试图理解正则表达式,我在重复部分:{m, n}
。为什么这个正则表达式不起作用({m,n})?
我有这样的代码:
>>> p = re.compile('a{1}b{1, 3}')
>>> p.match('ab')
>>> p.match('abbb')
正如你可以看到这两个字符串不匹配模式。这是为什么发生?
您不应该在逗号后放一个空格,并且{1}
是多余的。
尝试
p = re.compile('a{1}b{1,3}')
...和心灵的空间。
哇,我从来没有想过,这可能会导致一个问题。 – user225312 2011-02-12 15:14:30
删除b
中多余的空格。
变化:
p = re.compile('a{1}b{1, 3}')
到:
p = re.compile('a{1}b{1,3}')
^ # no whitespace
,所有应该很好。
请勿在{
和}
之间插入空格。
p = re.compile('a{1}b{1,3}')
您已经看到了一些re
的行为,这是非常“黑暗的角落”,在一个(或两个)的bug近了。
# 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}"
,并在详细模式文字文本"b{1,3}"
匹配的图案。
的“最小惊讶的法”建议:(1)在3
前面的空间被忽略和它在编译时匹配"b"
,"bb"
,或"bbb"
酌情[优选]或(2)的异常。
看着它的另一种方式:两种可能性:(一)谁写"{1, 3}"
处处洋溢着PEP8的精神,并认为它是规范和应用无处不在的人(B)谁写道,已经测试re
无证行为和人实际上想要匹配文字文本"b{1, 3}"
并且相反想要使用r"b{1, 3}"
而不是明确转义:r"b\{1, 3}"
。在我看来,(a)比(b)更可能,并且re
应该相应地采取行动。
又一个角度:当到达空间时,它已经解析了{
,一串数字和一个逗号,即顺利进入{m,n}
“经营者” ......悄悄忽略了意外字符,并把它当作好像它是文字文本是令人难以置信的,Perl化等
更新Bug report提出。
我已经接受你的答案,因为它也提到了{1}部分。谢谢。 – user225312 2011-02-12 15:26:26