0

给定一个输入:

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>.*?)(/[/*])?')

现在不打印任何东西。不是正则表达式根本不匹配,因为resultis not None

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

4

3 回答 3

1

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

regex.search()文档说:

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

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

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

于 2019-02-22T02:58:46.730 回答
1

Maybe it is not the answer you are looking for, but it may help:

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

output:

('say hi ', ' comment')

For details click here

于 2019-02-22T03:01:24.980 回答
0

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

并且由于(/[/*])?是可选的,因此命令组可能不匹配。

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

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

匹配

" say hi /* comment"
" say hi ..."
于 2019-02-22T03:19:05.343 回答