正则表达式匹配相同分隔符之间的多个结果

时间:2017-11-22 17:15:19

标签: python regex python-3.x

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

我正在尝试返回一个列表

[<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 个答案:

答案 0 :(得分:3)

如果要在同一个字符串

中匹配多个结果,可以使用re.findall()

试试这个:

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

答案 1 :(得分:1)

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

防止它的两个选项:

  1. 使用延迟量词*?
  2. 如果中间没有发生%的风险,则会更好,添加对比度并使用否定的字符类[^%]*