Python 正则表达式在同一分隔符之间匹配多个结果

Python 正则表达式在同一分隔符之间匹配多个结果,python,regex,python-3.x,Python,Regex,Python 3.x,非常差的标题-如果您觉得有帮助,请随时更新 我正试图返回一个列表 [,…,] 在以下字符串中: “%%%%\u任何东西都可以在这里\u%%%” 以下代码可以工作,但如果行中的“%%”数大于2,则会占用第一组和最后一组“%%”之间的所有内容 >>> import re >>> str = '%%nas_ip_address%%' >>> re.match('%%(.*)%%', str, re.DOTALL).group(1) 'nas_ip_

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

我正试图返回一个列表

[,…,]

在以下字符串中:

%%%%\u任何东西都可以在这里\u%%%

以下代码可以工作,但如果行中的“
%%
”数大于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\u ip\u address','sfs\u storage\u pool']
?我希望解析一个非常大的文件,但是性能不是问题,因为它不是用于生产的

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

试试这个:

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

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

试试这个:

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

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

有两种方法可以防止它:

  • 使用惰性量词
    *?
  • 如果中间没有发生
    %
    的风险,则最好添加对比度并使用否定字符类
    [^%]*

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

    有两种方法可以防止它:

  • 使用惰性量词
    *?
  • 如果中间没有发生
    %
    的风险,则最好添加对比度并使用否定字符类
    [^%]*
  • ({2,})(.*)\1
    ?捕获组2
    ({2,})(.*)\1
    ?捕获组2