<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>')]
答案 0 :(得分:1)
在?
之后添加问号((<name>.*?</name>)
)以确保它可以显示0或1次或星号(*
)多次(取决于输入) )。
re.compile(r'(<name>.*?</name>)(.*?)(<resource>.*?</resource>)<apply>')
这将让正则表达式捕获额外的资源。
如果你不需要描述,你就永远无法捕获它:
re.compile('(<name>.*?</name>).*?(<resource>.*?</resource>)<apply>')