如何匹配嵌套字符串而不是单独的字符串

时间:2015-04-13 01:27:05

标签: python regex string lexicon

我正在尝试匹配正则表达式

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答案很棒!

1 个答案:

答案 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 ? ']

DEMO

更新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 ? ? ?']

DEMO