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

时间:2019-02-22 02:31:12

标签: python regex python-3.x python-regex

输入:

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 个答案:

答案 0 :(得分:1)

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

regex.search()文档说:

  

如果有多个匹配项,则仅返回匹配的第一个匹配项

由于/[/*]是可选的,因此没有约束来匹配/字符。因此它甚至可以匹配第一个空格,也可以匹配任何部分。

您可以在regex101中在线检查此正则表达式。您可以找到其过程和结果。

答案 1 :(得分:1)

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

regex = re.compile(r'\s*(?P<command>.*?)/[/*](?P<optional>.*)')
result = regex.search(line)
print(result.group('command','optional'))

输出:

('say hi ', ' comment')

有关详细信息,请单击here

答案 2 :(得分:0)

在上面的示例中,?P<command>.*?使用非贪婪限定符*?,+?,??或{m,n} ?,它们匹配的文本越少越好。有关更多详细信息,请参见Greedy versus Non-Greedy

并且由于(/[/*])?是可选的,因此 command 组可能没有任何匹配项。

如果您要对不带注释的行进行正则表达式,请使用以下

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

匹配

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