[英]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.