我正在try 创建一个规则表达来匹配表单的模式:

content = "identifier{ {{var1}} rest of the content} outer content identifier{ {{var2}} another content} identifier{ content with no vars }"

所以假设我在content上运行re.findall,返回值应该是:

["{{var1}} rest of the content", "{{var2}} another content", "content with no vars"]

我想要匹配的模式是identifier\{.*?\},但我不知道如何让它工作,因为封闭模式包含在我想要匹配的文本中,所以当我让它小气时,它要么在所需的位置之前匹配,要么在贪婪时它会将两个模式相互合并,这是我不想要的.

推荐答案

如果您想允许多次出现{{var}}而不允许任何其他卷发:

{([^{}]*(?:{{[^{}]*}}[^{}]*)*)}

模式匹配:

  • {场比赛
  • ( Capture group 1
    • [^{}]*匹配{}以外的可选字符
    • (?: Non capture group
      • {{场比赛
      • [^{}]* atch除{}之外的可选字符
      • }}场比赛
      • [^{}]*匹配{}以外的可选字符
    • )*关闭非捕获组并 Select 重复此操作
  • )接近第1组
  • }场比赛

Regex demo

要删除开头和结尾空白,您可以使用strip:

import re

pattern = r"{([^{}]*(?:{{[^{}]*}}[^{}]*)*)}"
content = "identifier{ {{var1}} rest of the content} outer content identifier{ {{var2}} another content} identifier{ content with no vars }"

print([s.strip() for s in re.findall(pattern, content)])

输出

['{{var1}} rest of the content', '{{var2}} another content', 'content with no vars']

如果您希望捕获组值没有周围的空白,并且仅允许一个开头和结尾curl ,则可以使用具有负修饰的非贪婪量化词:

(?<!{){\s*([^{}]*?(?:{{[^{}]+}}[^{}]*?)*)\s*}(?!})

Regex demo

Python相关问答推荐

通过优化空间在Python中的饼图中添加标签

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

acme错误-Veritas错误:模块收件箱没有属性linear_util'

try 在树叶 map 上应用覆盖磁贴

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

. str.替换pandas.series的方法未按预期工作

输出中带有南的亚麻神经网络

如何获取numpy数组的特定索引值?

在vscode上使用Python虚拟环境时((env))

如何在TensorFlow中分类多个类

如何排除prefecture_related中查询集为空的实例?

幂集,其中每个元素可以是正或负""""

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量

pandas:在操作pandora之后将pandora列转换为int

Django Table—如果项目是唯一的,则单行

一个telegram 机器人应该发送一个测验如何做?""

使用python playwright从 Select 子菜单中 Select 值

获取PANDA GROUP BY转换中的组的名称

当输入是字典时,`pandas. concat`如何工作?

为什么在生成时间序列时,元组索引会超出范围?