正则表达式仅捕获重复组的最后一次出现

时间:2017-05-09 09:02:24

标签: python regex

我正在尝试捕获多个“< attribute> =< value>”与来自字符串的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', '')

专注于&lt; attrib&gt; =“&lt; value&gt;”工作原理:

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

所以一个实用的解决方案可能是在运行这个正则表达式之前测试"<tag" in string但是..

为什么原始正则表达式仅捕获最后一次出现以及需要更改哪些内容以使其按预期工作?

3 个答案:

答案 0 :(得分:4)

这就是正则表达式的工作方式:您定义了一个捕获组,因此只有一个捕获组。当它首次捕获某些东西,然后捕获另一个东西时,第一个捕获的项目将被替换。这就是为什么你只能获得最后一个捕获的项目。
我没有解决的问题......

答案 1 :(得分:0)

documentation搜索只会返回一次。 findAll方法返回列表中的所有匹配项。这就是你需要使用的东西,就像你的第二个例子一样。

答案 2 :(得分:0)

不幸的是,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']}