Как сопоставить вложенные строки, а не отдельные строки

Я пытаюсь сопоставить регулярное выражение так, чтобы

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:

Тем не менее, вывод ['? Красный цвет? Имя Юрий? '] и это должно быть ['? красный цвет? имя Юрий?? '] (Два знака вопроса) Примечание Вложенность может быть бесконечной, т. Е. "Имя" имя "цвет" цвет "???

Так что идея имеет "команду" представлять вызовы функций, так скажем, у нас есть "добавить 2" умножить 3 3 5 "?" -> Он должен выполнить "? Умножить 3 3?" который возвращает 9, а затем он "? добавить 2 9(который мы получили из возврата) 5?" что составляет до 16

ОБНОВЛЕНИЕ 2:

Ответ Авинаша от UPDATE 2 работает ОТЛИЧНО!

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

Другие вопросы по тегам