我正在尝试匹配正则表达式
hello ?color red ?name Yuri ? ? to the forum
将输出
?color red ?name Yuri ? ?
请注意,命令的开头始终为(?+至少一个字母),命令的结尾始终为(?+空格)
我尝试使用以下正则表达式:
/\?[^ ](.)*\?/g
但是,如果我们有这个输入:
hello ?name Yuri ? welcome to ?forum Python ? It's awesome!
匹配:
?name Yuri ? welcome to ?forum Python ?
但是,它应该单独匹配(即[?name Yuri ? , ?forum Python ?]
)
请帮忙!同样,命令总是以?+字母开头,以?+空格
结束更新1:
然而,输出是''红色?名称Yuri? ']它应该是['?color red?名称Yuri? ? '](两个问号) 注意嵌套可以是无限的,即?name?name?color?color? ? ? ?
所以这个想法是拥有?命令?代表函数调用,所以假设我们有“?加2?乘3 3?5?” - >它应该执行“?乘3 3?”返回9,然后它“?添加2 9(我们从返回中获得)5?”最多可加16个
更新2:
Avinash的UPDATE 2答案很棒!
答案 0 :(得分:1)
你需要使用非贪婪的正则表达式。
>>> import re
>>> s = "hello ?name Yuri ? welcome to ?forum Python ? It's awesome!"
>>> re.findall(r'\?[a-zA-Z].*?\?\s', s)
['?name Yuri ? ', '?forum Python ? ']
如果您不想打印最后一个空白区域,请添加正向前瞻断言。
>>> re.findall(r'\?[a-zA-Z].*?\?(?=\s)', s)
['?name Yuri ?', '?forum Python ?']
<强>更新强>
>>> re.findall(r'\?[A-Za-z](?:\?[^?\n]*\?|[^?\n])*?\?\s', 'hello ?color red ?name Yuri ? ? to the forum')
['?color red ?name Yuri ? ? ']
>>> re.findall(r'\?[A-Za-z](?:\?[^?\n]*\?|[^?\n])*?\?\s', "hello ?name Yuri ? welcome to ?forum Python ? It's awesome!")
['?name Yuri ? ', '?forum Python ? ']
更新2:
>>> import regex
>>> regex.findall(r'\?(?:(?R)|[^?])*\?', 'hello ?color ?size 22 red ?name Yuri ? ? ? ')
['?color ?size 22 red ?name Yuri ? ? ?']
>>> regex.findall(r'\?(?=\S)(?:(?R)|[^?])*\?(?=\s)', 'hello ?color ?size 22 red ?name Yuri ? ? ? ')
['?color ?size 22 red ?name Yuri ? ? ?']