[英]Python regex unexpected behaviour
str1='<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com"'
str2='<a href="/states/florida/433" title="florida">'
pat = re.compile('/states/.*/([^"]+)')
if ( pat.findall(str2) == pat.findall(str1)):
print "TRUE"
else:
print "FALSE"
輸出:FALSE,
輸出2:433
輸出1:abc.com
有人可以解釋嗎?
使用勉強的量詞- .*?
,而不是貪婪的- .*
,一切都會好起來的:-
pat = re.compile('/states/.*?/([^"]+)')
默認情況下,量詞是greedy ,從某種意義上說,它們試圖覆蓋盡可能多的字符串,並且仍然保留模式的其余部分以匹配其余的字符串。 使用?
在量詞變得不願意之后 ,在這種情況下,它們將在下一個字符的第一個匹配項- /
處停止。
在第一個URL上,您的regexp與整個字符串匹配:
<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com
/states/ .* /([^"]+)
並不是
<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com
/states/ .* /([^"])+
他們很貪婪, .*
吃掉盡可能多的數據。
您的RegEx正常工作:
<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com"
^^^^^^^^............................................................^^^^^^^
/states/ .*/ [^"]+
和:
<a href="/states/florida/433" title="florida">
^^^^^^^^........^^^
如果您不想在第一種情況下使用整個字符串,請使用?
,非貪婪匹配量詞表示“ /states/
后跟任意數量的字符,直到第一個 /
后跟一個或多個非引號字符”
您是貪婪的模式(您可以在以下位置閱讀有關貪婪和非貪婪正則表達式模式的信息: http : //docs.python.org/2/library/re.html以及此處: http : //www.itworld.com/nl / perl / 01112001。更改模式
'/states/.*/([^"]+)'
至
'/states/.*/([^"]+)'
返回true。 這是完整的修改源:
import re
str1='<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com"'
str2='<a href="/states/florida/433" title="florida">'
pat = re.compile('/states/.*?/([^"]+)')
if ( pat.findall(str2) == pat.findall(str1)):
print "TRUE"
else:
print "FALSE"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.