2017-05-09 116 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中使用<标签。 –