【问题标题】:regex doesn't capture all groups正则表达式不会捕获所有组
【发布时间】:2017-08-08 11:21:02
【问题描述】:
   <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 文件转换为上述值的字符串并尝试捕获多次出现的 &lt;resource&gt;ABC&lt;/resource&gt; 我有以下正则表达式 在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>

这样做时,我会将“name”元素与其关联的资源元素组合在一起,这样与此正则表达式匹配的第一个元组将包含以下内容:

('<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>')]

【问题讨论】:

  • 欢迎来到 SO。很高兴您使用代码 sn-p,但首先您不仅要明确显示正则表达式和希望的结果(您也做得不好),还要显示要匹配的文本。
  • 谢谢,抱歉输入错误。我已经更新了它以提供更多解释。

标签: python regex xml


【解决方案1】:

(&lt;name&gt;.*?&lt;/name&gt;) 之后添加问号 (?) 以确保它可以出现 0 次或 1 次或星号 (*) 出现多次(取决于输入)。

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

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

Online Demo

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

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

【讨论】:

  • 但这也显示了例如我不想要的“selected”。如果这次我将资源正则表达式更改为“(.+?)”,我只会得到一个资源而不是所有资源。
  • @tirexxerit,不,它从不捕获&lt;apply&gt;selected&lt;/apply&gt;
  • @tirexxerit,哦,你更新了输入,我没注意到。编辑了正则表达式,现在应该可以了。
  • 谢谢,与 匹配但我认为分组已经帮助我捕获所有资源而无需键入 但显然情况并非如此。谢谢!
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多