我正在尝试匹配字符子集中的一个字符,其中匹配字符的任一侧都可以是任何内容。
举个例子:
{{ 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']
详情
- 仅使用
{{(.*?)}}正则表达式提取{{...}}之间的所有匹配项(注意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
