输入:
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
。
为什么当正则表达式不是可选的时它可以工作,但是当它是可选的时就停止工作,我将如何解决呢?
答案 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 ..."