【问题标题】:Regex match multiple results between the same delimiters正则表达式匹配相同分隔符之间的多个结果
【发布时间】:2017-11-22 17:15:19
【问题描述】:

标题很差 - 如果您觉得可以提供帮助,请随时更新它

我正在尝试返回一个列表

[<str1>, <str2>,...,<strX>]

在以下字符串中:

'%%<str1>%%_Anything_Can_Be_Here_%%<str2>%%'

以下代码有效,但如果行中“%%”的数量大于 2,则它将获取第一组和最后一组“%%”之间的所有内容。

>>> import re
>>> str = '%%nas_ip_address%%'
>>> re.match('%%(.*)%%', str, re.DOTALL).group(1)
'nas_ip_address'


>>> str = '%%nas_ip_address%%:/vx/%%sfs_storage_pool%%'
>>> re.match('%%(.*)%%', str, re.DOTALL).group(1)
'nas_ip_address%%:/vx/%%sfs_storage_pool'
>>> re.match('%%(.*)%%', str, re.DOTALL).groups()
('nas_ip_address%%:/vx/%%sfs_storage_pool',)

有没有办法使用正则表达式从字符串中提取['nas_ip_address', 'sfs_storage_pool']?我希望解析一个非常大的文件,但是性能不是问题,因为它不适用于生产

【问题讨论】:

  • (%{2,})(.*?)\1?捕获组 2

标签: python regex python-3.x


【解决方案1】:

如果你想在同一个字符串中匹配多个结果,你可以使用re.findall()

试试这个:

import re
str = '%%nas_ip_address%%:/vx/%%sfs_storage_pool%%'
re.findall('%%(.*?)%%', str, re.DOTALL)

【讨论】:

    【解决方案2】:

    因为*默认是贪婪的,这意味着它将消耗所有内容直到最后,然后一次回溯一个字符,直到找到最接近的%%,然后接近字符串的末尾。

    防止它的两个选项:

    1. 使用惰性量词*?
    2. 如果两者之间没有出现% 的风险,那就更好了,添加对比度并使用否定字符类[^%]*

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 2017-05-29
      • 1970-01-01
      • 2017-02-16
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多