試圖理解正則表達式,我在重複部分:{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