Skip to main content
 首页 » 编程设计

Python/Regex之匹配两个字符之间的字符,匹配字符之前或之后的任何内容

2025年05月04日14xing901022

我正在尝试匹配字符子集中的一个字符,其中匹配字符的任一侧都可以是任何内容。

举个例子:

{{ SITE_AGGREGATE_SUBNET }}.3 remote-as {{ BGP-AS }} 

针对上述情况,我想匹配 {{ 和 }} 之间的任何内容,其中包含破折号“-”。

到目前为止,我的正则表达式模式是:

(?<={{)(.*?-.*?)(?=}}) 

但这是为返回的整个测试字符串创建匹配:

SITE_AGGREGATE_SUBNET }}.3 remote-as {{ BGP-AS 

有谁能看出我错过了什么吗?我明白为什么我的正则表达式不能按预期工作,但不知道如何修复它。

谢谢

请您参考如下方法:

使用

import re 
s = '{{ SITE_AGGREGATE_SUBNET }}.3 remote-as {{ BGP-AS }}' 
print([x.strip() for x in re.findall(r'{{(.*?)}}', s) if '-' in x]) 
// -> ['BGP-AS'] 

参见 the Python demo

详情

  • 仅使用 {{(.*?)}} 正则表达式提取 {{...}} 之间的所有匹配项(注意 re.findall 将只返回捕获的替换,与 (.*?))
  • 匹配的值
  • 使用列表理解内的条件(if '-' in x)只保留与 - 的匹配
  • 使用 .strip() 删除尾随/前导空格

单个正则表达式方法(注意它可能会变得效率较低):

re.findall(r'{{\s*((?:(?!{{|}})[^-])*-.*?)\s*}}', s) 

参见 Python demo

详情

  • {{ - {{
  • \s* - 0+ 个空格
  • ((?:(?!{{|}})[^-])*-.*?) - 捕获第 1 组(re.findall 将返回什么):
    • (?:(?!{{|}})[^-])* - tempered greedy token匹配任何非连字符字符,0 次以上,不以 {{ 和 }} 子字符串开头
    • - - 连字符
    • .*? - 任何 0+ 个字符(LF 除外),尽可能少
  • \s* - 0+ 个空格
  • }} - }}。

参见 regex demo