Python正则表达式意外行为

时间:2013-01-30 18:32:34

标签: python regex

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

有人可以解释一下吗?

4 个答案:

答案 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"