给定一个字符串,我需要在$
后面标识可能被{ }
包围也可能不被包围的字段:
$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]+)(?:})'
这使得支撑是强制性的,但不能捕获......