$给定一个字符串,我需要识别 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 $。
2 回答
jeck猫
TA贡献1909条经验 获得超7个赞
如果开头{
与结尾相匹配,}
您可以使用 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 = verb\n"
"${verb}age = verb")
print(re.findall(regex, test_str))
输出
['verb', 'verb']
编辑
对于更新的问题,例如使用捕获组,您可以匹配一个或 3 个或更多美元符号,断言前面的不是美元符号。
(?<!\$)(?:\$(?:\${2,})?)(?:{([_a-zA-Z0-9]+)}|([_a-zA-Z0-9]+))
牧羊人nacy
TA贡献1862条经验 获得超7个赞
您可以通过以下方式获得第二组匹配:
reg2 = '\$(?:{)([_a-zA-Z0-9]+)(?:})'
这使得支撑是强制性的,但没有被捕获......
添加回答
举报
0/150
提交
取消