如何在这些情况下使用正则表达式?



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

$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}

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

更新:

当涉及到前面的$时,以下将是无效的字符串:

$$verb = invalid
$${verb} = invalid

但这些将是有效的:

$$$verb = $verb
$$${verb} = $verb

这是因为$$之后会替换为单个$

如果开始{与结束}匹配,则可以使用 2 个具有交替的捕获组,然后值将在组 1 或组 2 中。

如果$前面不应该有另一个$您可以使用负面的后视(?<!$)$直接在左侧断言不是美元符号。

$(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))b

正则表达式演示

或者,要仅获取值,您可以使用与环顾的交替

(?<=$)[_a-zA-Z0-9]+b|(?<=${)[_a-zA-Z0-9]+(?=})

正则表达式演示

import re
regex = r"(?<=$)[_a-zA-Z0-9]+b|(?<=${)[_a-zA-Z0-9]+(?=})"
test_str = ("$verb = verbn"
"${verb}age = verb")
print(re.findall(regex, test_str))

输出

['verb', 'verb']

编辑

对于更新的问题,例如使用捕获组,您可以匹配单个或 3 个或更多美元符号,断言前面的内容不是美元符号。

(?<!$)(?:$(?:${2,})?)(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))

正则表达式演示

你可以得到第二组匹配,如下所示:

reg2 = '$(?:{)([_a-zA-Z0-9]+)(?:})'

这使得支撑是强制性的,但不能捕获......

最新更新