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

Python 正则表达式在没有可选组的情况下工作,但与可选组中断

Python 正则表达式在没有可选组的情况下工作,但与可选组中断

千巷猫影 2021-11-16 10:55:57
给定一个输入:line = " say hi /* comment"和一个正则表达式:regex = re.compile(r'\s*(?P<command>.*?)/[/*]')result = regex.search(line)print(result.group('command'))这将成功打印say hi。但是,将最后一部分切换到可选组:regex = re.compile(r'\s*(?P<command>.*?)(/[/*])?')现在不打印任何东西。这不是正则表达式根本不匹配,因为result不是None.为什么当正则表达式不是可选的时它可以工作,但当它是可选的时停止工作,我将如何解决它?
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

也许这不是您正在寻找的答案,但它可能会有所帮助:


regex = re.compile(r'\s*(?P<command>.*?)/[/*](?P<optional>.*)')

result = regex.search(line)

print(result.group('command','optional'))

输出:


('say hi ', ' comment')

详情请点击这里


查看完整回答
反对 回复 2021-11-16
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

在上面的示例中,?P<command>.*?使用非贪婪限定符 *?、+?、?? 或 {m,n}?,它们匹配尽可能少的文本。有关更多详细信息,请参阅贪婪与非贪婪

由于(/[/*])?是可选的,命令组可以不匹配。

如果您想在没有注释的情况下对一行进行正则表达式,请使用以下命令

\s*(?P<command>.*?)(?:/[/*]|$)

匹配

" say hi /* comment"
" say hi ..."


查看完整回答
反对 回复 2021-11-16
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

regex.search()将找到第一个匹配子串。您可以regex.findall()在这种情况下使用。

regex.search() 文档说:

如果有多个匹配项,则只返回匹配项的第一次出现

因为/[/*]可选,所以它没有匹配/字符的约束。所以它甚至可以匹配第一个空格,它可以匹配任何部分。

您可以在regex101 中在线查看此正则表达式。你可以找到它的过程和结果。


查看完整回答
反对 回复 2021-11-16
  • 3 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

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