如何在这些情况下使用 RegEx?

$给定一个字符串,我需要识别 a 后面可能被或可能不被 包围的字段{ }:


$verb = verb

${verb}age = verb

$$作为一种逃避,我需要考虑到这一点以及它可能在定界之前$。


到目前为止我所拥有的是:


reg = r'\$([_a-zA-Z0-9]*)'

s = '$who likes $what'

re.findall(reg, s)

['who', 'what']

但我无法设计可选支撑的表达式,我尝试过:


reg = r'\$({?[_a-zA-Z0-9]*}?)'

但这会获取诸如以下的值:


${who

$who}

能够解释可选支撑的适当表达式是什么?


更新:


当涉及到 previous 时$,以下内容将是无效字符串:


$$verb = invalid

$${verb} = invalid

但这些都是有效的:


$$$verb = $verb

$$${verb} = $verb

这是因为 a之后$$被替换为 single $。


白衣非少年
浏览 84回答 2
2回答

jeck猫

如果开头{与结尾相匹配,}您可以使用 2 个交替的捕获组,然后该值将位于组 1 或组 2 中。如果 前面$不应有另一个,$您可以使用负向后查找(?<!\$)\$,断言左侧不直接有美元符号。\$(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))\b正则表达式演示或者仅获取值,您可以使用环视的替代(?<=\$)[_a-zA-Z0-9]+\b|(?<=\${)[_a-zA-Z0-9]+(?=})正则表达式演示import reregex = r"(?<=\$)[_a-zA-Z0-9]+\b|(?<=\${)[_a-zA-Z0-9]+(?=})"test_str = ("$verb = verb\n"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "${verb}age = verb")print(re.findall(regex, test_str))输出['verb', 'verb']编辑对于更新的问题,例如使用捕获组,您可以匹配一个或 3 个或更多美元符号,断言前面的不是美元符号。(?<!\$)(?:\$(?:\${2,})?)(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))

牧羊人nacy

您可以通过以下方式获得第二组匹配:reg2&nbsp;=&nbsp;'\$(?:{)([_a-zA-Z0-9]+)(?:})'这使得支撑是强制性的,但没有被捕获......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python