簡體   English   中英

正則表達式只捕獲重復組的最后一次出現

[英]Regular expression only captures the last occurence of repeated group

我試圖從這樣的字符串中使用Python 正則表達式捕獲多個 "<attribute> = <value>" 對:

  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>="<value>" 作品:

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

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

為什么原始正則表達式只捕獲最后一次出現的情況以及需要更改哪些內容才能使其按預期工作?

這就是正則表達式的工作原理:您定義了一個捕獲組,因此只有一個捕獲組。 當它首先捕獲某物,然后捕獲另一物時,第一個捕獲的項目將被替換。這就是為什么您只能獲得最后一個捕獲的項目。
我所知道的沒有解決方案......

不幸的是,python 的re模塊無法做到這一點。 但是regex為此提供了capturescapturesdict函數:

>>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
>>> m.groupdict()
{'word': 'three', 'digits': '3'}
>>> m.captures("word")
['one', 'two', 'three']
>>> m.captures("digits")
['1', '2', '3']
>>> m.capturesdict()
{'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']}

文檔搜索中將只返回一次。 findAll 方法返回列表中的所有匹配項。 這就是您需要使用的,就像在您的第二個示例中一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM