繁体   English   中英

Python正则表达式意外行为

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM