正则表达式并不捕获所有组

时间:2017-08-08 11:21:02

标签: python regex xml

   <name>name for the group</name><description>server-description</description><resource>10.1.1.1:*</resource><resource>10.1.1.2:*</resource><resource>10.1.1.3:*</resource><apply>selected</apply><network-connect-acl><<name>name2</name><description>description2/description><resource>10.2.2.0/26:*</resource><apply>selected</apply>

我已将XML文件转换为字符串作为上述值并尝试捕获多次出现的<resource>ABC</resource>我有以下正则表达式 在python3中定义

regex = re.compile(r'(<name>.*?</name>)(.*?)(<resource>.*?</resource>)+')
print(regex.findall(string))

但不是捕捉所有三次出现,而是只抓住第一次:

('<name>name for the group</name>', '<description>server-
description</description>', '<resource>10.1.1.1:*</resource>')

我希望正则表达式捕获中间的字符串和标签。如果我们把上面的字符串作为样本,我希望能得到类似的东西;

<name>name for the group</name><resource>10.1.1.1:*</resource><resource>10.1.1.2:*</resource><resource>10.1.1.3:*</resource><name>name2</name><description>description2/description><resource>10.2.2.0/26:*</resource>

这样做,我将分组&#34; name&#34;元素及其关联的资源元素,以便此正则表达式匹配的第一个元组将包含:

('<name>nameforthegroup</name>','<resource>10.1.1.1:*</resource>
<resource>10.1.1.2:*</resource><resource>10.1.1.3:*</resource>')

和第二个元组和堡垒将是这样的

('<name>name2</name>','<resource>10.2.2.0/26:*</resource>)

该文件包含数百条这样的记录,但是当我运行代码时,我会得到类似的结果:

[('<name>nameforthegroup</name>', '<description>server-description</description>', '<resource>10.1.1.1:*</resource>'), ('<name>name2</name>', '<description>description2/description>', '<resource>10.2.2.0/26:*</resource>')]

1 个答案:

答案 0 :(得分:1)

?之后添加问号((<name>.*?</name>))以确保它可以显示0或1次或星号(*)多次(取决于输入) )。

re.compile(r'(<name>.*?</name>)(.*?)(<resource>.*?</resource>)<apply>')

这将让正则表达式捕获额外的资源。

Online Demo

如果你不需要描述,你就永远无法捕获它:

re.compile('(<name>.*?</name>).*?(<resource>.*?</resource>)<apply>')