2014-12-05 59 views
1

下面Python的正則表達式模式的findall

get_tags = lambda t: re.findall(r"<(.+)>", t) 
st = "xyx<ab>xy x<bc> xyx<cd>xyxy xx<de> xyx <ef>x y<fg><gh>y" 

print(get_tags(st)) 

預期輸出的reg表達式是

['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh'] 

即使圖案不是貪婪(沒有 '*' 用於?),則表達式給出輸出

['a>xyx<b>xyx<c>xyxyxx<d>xyx<e>xy<f><g'] 

模式中的問題是什麼?

回答

2

.+默認爲貪婪。您需要在+旁邊添加?不情願的量詞,以進行非貪婪的匹配。

get_tags = lambda t: re.findall(r"<(.+?)>", t) 

OR

get_tags = lambda t: re.findall(r"<([^<>]+)>", t) 

[^<>]+否定的字符類匹配任何字符,但不是><一次或多次。

>>> get_tags = lambda t: re.findall(r"<(.+?)>", t) 
>>> st = "xyx<ab>xy x<bc> xyx<cd>xyxy xx<de> xyx <ef>x y<fg><gh>y" 
>>> print(get_tags(st)) 
['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh'] 
>>> get_tags = lambda t: re.findall(r"<([^<>]+)>", t) 
>>> print(get_tags(st)) 
['ab', 'bc', 'cd', 'de', 'ef', 'fg', 'gh'] 
0

既然你知道找< >之間只有字母,你也可以使用

get_tags = lambda t: re.findall(r"<(\w+)>", t) 

爲正則表達式。那隻會在< >之間搜索[A-Za-z],並且由於在示例中括號內有一些不同的空格。這也會起作用。