gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:11 25 4
gpt4 key购买 nike

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

举个例子:

{{ 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

关于Python/Regex - 匹配两个字符之间的字符,匹配字符之前或之后的任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51025302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com