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

给定一个输入:


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.


为什么当正则表达式不是可选的时它可以工作,但当它是可选的时停止工作,我将如何解决它?


千巷猫影
浏览 225回答 3
3回答

白衣染霜花

也许这不是您正在寻找的答案,但它可能会有所帮助:regex = re.compile(r'\s*(?P<command>.*?)/[/*](?P<optional>.*)')result = regex.search(line)print(result.group('command','optional'))输出:('say hi ', ' comment')详情请点击这里

蛊毒传说

在上面的示例中,?P<command>.*?使用非贪婪限定符 *?、+?、?? 或 {m,n}?,它们匹配尽可能少的文本。有关更多详细信息,请参阅贪婪与非贪婪由于(/[/*])?是可选的,命令组可以不匹配。如果您想在没有注释的情况下对一行进行正则表达式,请使用以下命令\s*(?P<command>.*?)(?:/[/*]|$)匹配"&nbsp;say&nbsp;hi&nbsp;/*&nbsp;comment" "&nbsp;say&nbsp;hi&nbsp;..."

慕尼黑5688855

regex.search()将找到第一个匹配子串。您可以regex.findall()在这种情况下使用。regex.search()&nbsp;文档说:如果有多个匹配项,则只返回匹配项的第一次出现因为/[/*]可选,所以它没有匹配/字符的约束。所以它甚至可以匹配第一个空格,它可以匹配任何部分。您可以在regex101 中在线查看此正则表达式。你可以找到它的过程和结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python