【发布时间】:2017-10-07 12:14:54
【问题描述】:
我正在尝试从这样的字符串中捕获多个带有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', '')
专注于
>>> re.findall("(?:\s*(\w+)\s*=\"(.*?)\")", ' some(code) \' <tag attrib1="some_value" attrib2="value2" en=""/>')
[('attrib1', 'some_value'), ('attrib2', 'value2'), ('en', '')]
所以一个务实的解决方案可能是在运行这个正则表达式之前测试"<tag" in string,但是..
为什么原始的正则表达式只捕获最后一次出现以及需要进行哪些更改才能使其按预期工作?
【问题讨论】:
-
每周“如何使用正则表达式解析 html/xml”问题...使用 XML 解析器。不要尝试在非正则语言上使用 正则 表达式。
-
你说得对,问题实际上是关于正则表达式,而不是 XML。
-
这就是正则表达式的工作原理。它只捕获最后一次出现。您无法使用正则表达式捕获任意数量的事件。编写循环以多次应用正则表达式,或使用 xml 解析器。
-
@Rawing 您能否详细说明为什么它只捕获“答案”中重复组的最后一次出现或提供一些参考?如果引擎“看到”重复组,为什么不捕获它?是否可以选择不覆盖最后一场小组赛?
-
@StutiRastogi 不,但谢谢。顺便说一句:字符串只是可能包含或不包含我要提取的数据的许多行之一,因此它还需要匹配
' <tag。