为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣非少年 2024-01-15 21:06:31
$给定一个字符串,我需要识别 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]+))


查看完整回答
反对 回复 2024-01-15
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您可以通过以下方式获得第二组匹配:

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

这使得支撑是强制性的,但没有被捕获......


查看完整回答
反对 回复 2024-01-15
  • 2 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信