2017-05-09 119 views
0

我想捕獲多的最後一次出現「<屬性> = <價值>」從這樣的字符串,其Python regular expression對:正則表達式只捕獲重複組

some(code) ' <tag attrib1="some_value" attrib2="value2"     en=""/> 

正則表達式'\s*<tag(?:\s*(\w+)\s*=\"(.*?)\")*是打算多次匹配這些對,即返回類似於

"attrib1", "some_value", "attrib2", "value2", "en", "" 

但它只捕獲最後一次發生:

>>> import re 
>>> re.search("'\s*<tag(?:\s*(\w+)\s*=\"(.*?)\")*", ' some(code) \' <tag attrib1="some_value" attrib2="value2"     en=""/>').groups() 
('en', '') 

關注<ATTRIB> = 「<價值>」 作品:

>>> re.findall("(?:\s*(\w+)\s*=\"(.*?)\")", ' some(code) \' <tag attrib1="some_value" attrib2="value2"     en=""/>') 
[('attrib1', 'some_value'), ('attrib2', 'value2'), ('en', '')] 

這樣一個務實的解決方案可能是運行這個正則表達式之前測試"<tag" in string,但..

爲什麼原始正則表達式是否僅捕獲最後一次發生的事情,以及需要更改哪些內容才能使其正常工作?

+0

每週「如何解析HTML/XML與正則表達式」的問題...使用XML解析器。不要試圖對不規則的語言使用* regular *表達式。 – DeepSpace

+0

你說得對,這個問題真的是關於正則表達式,而不是XML。 – handle

+2

這就是正則表達式的工作原理。它只捕獲最後一次發生。你不能用正則表達式捕獲任意數量的事件。編寫一個循環來多次應用正則表達式,或使用xml解析器。 –

回答

3

這就是正則表達式的工作原理:您定義了一個捕獲組,因此只有一個捕獲組。當它首先捕獲某物,然後捕獲其他物品時,第一個捕獲的物品將被替換。這就是爲什麼你只能得到最後一個捕獲的物品。
有沒有解決方案,我知道...

0

documentation搜索將只返回一個出現。 findAll方法返回列表中的所有事件。這就是你需要使用的東西,就像你的第二個例子。

+0

沒錯,但我只需要一個事件:模式應該匹配_whole string_,儘管有一個組的多次重複。 'findall'也只返回最後一場比賽。 – handle

+0

模式_does_匹配整個字符串_with_組的重複,不幸的是,只有這樣不會產生多個匹配組。 – handle

+0

你的目標是什麼?你想只發生一次還是全部?第二個例子有什麼問題?我不知道你爲什麼要在RegEx中使用<標籤。 –