鉴于XML文档,我希望能够从特定标记中选择单个键/值对:
<aaa>key0:val0 key1:val1 key2:va2</aaa>
我想回来
key0:val0
key1:val1
key2:val2
到目前为止,我有
(?<=<aaa>).*(?=<\/aaa>)
哪个会匹配内部的所有内容,但结果却是一样。
我也有
[^\s][\w]*:[\w]*[^\s]
也会在群组中正确匹配:
key0:val0 key1:val1 key2:va2
但不是标签。我相信这是一个搜索子组的问题,我不知道如何绕过它。
谢谢!
答案 0 :(得分:1)
你不能以你想要的方式组合这两个表达,因为你必须匹配&#34; key:value&#34;的每一次出现。
所以你提出的问题 - (?<=<abc>)([\w]*:[\w]*[\s]*)+(?=<\/abc>)
- 有两个匹配的组。较大的一个匹配标签内的所有内容,而另一个匹配单个&#34;密钥:值&#34;发生。正则表达式引擎无法给出每个单独的出现,因为它不能以这种方式工作。所以它只是给你最后一个。
如果您认为在python中,在应用正则表达式后获得的matcher
对象上,您将可以访问matcher.group(1)
和matcher.group(2)
,因为您有两个匹配( )
正则表达式中的组。
但你想要的是n
出现的&#34; key:value&#34;。因此,在标记内的字符串上运行更简单的\w+:\w+
正则表达式会更容易。
答案 1 :(得分:0)
我在parsemarket上传了这个,我不确定你在寻找什么,但也许是这样的:
(<aaa>)((\w+:\w+\s)*(\w+:\w+)*)(<\/aaa>)
AFAIK,除非您知道标签中有多少个k:v对,否则您无法在一个正则表达式中捕获所有这些对。所以,如果只有三个,你可以这样做:
<(?:aaa)>(\w+:\w+\s*)+(\w+:\w+\s*)+(\w+:\w+\s*)+<(?:\/aaa)>
但我认为你会想用你正在使用的任何语言做某种循环。或者,正如一些评论所暗示的那样,使用该语言中的解析器类。我在Python中使用了BeautifulSoup来获取HTML。