簡體   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