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"
输出:错误,
输出2:433
output1:abc.com
有人可以解释一下吗?
答案 0 :(得分:3)
使用不情愿的量词 - .*?
,而不是贪婪的量词 - .*
,一切都会很好: -
pat = re.compile('/states/.*?/([^"]+)')
量词是默认的贪婪,从某种意义上说,他们试图尽可能多地覆盖字符串,并且仍然保留模式的其余部分以匹配剩余的字符串。在量词之后使用?
使其不情愿,在这种情况下,它们将在以下字符的第一个匹配位置停止 - 在这种情况下为/
。
答案 1 :(得分:1)
在第一个网址上,你的正则表达式匹配整个字符串:
<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/ .* /([^"])+
他们很贪婪,.*
尽可能多地吃掉数据。
答案 2 :(得分:1)
您的RegEx工作正常:
<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com"
^^^^^^^^............................................................^^^^^^^
/states/ .*/ [^"]+
和
<a href="/states/florida/433" title="florida">
^^^^^^^^........^^^
如果您不想在第一种情况下使用整个字符串,请使用?
,非贪婪的匹配量词表示“/states/
后跟任意数量的字符,直到第一个 /
后跟一个或多个非引号字符“
答案 3 :(得分:0)
你的模式是贪婪的(你可以在这里阅读贪婪和非贪婪的正则表达式模式: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"