正则表达式捕获标签内的单词

时间:2015-02-13 13:55:50

标签: regex

鉴于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

但不是标签。我相信这是一个搜索子组的问题,我不知道如何绕过它。

谢谢!

2 个答案:

答案 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。