如何匹配嵌套字符串而不是分隔字符串

2024-04-19 04:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着匹配一个正则表达式

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?“返回9,然后返回“?加上2 9(我们从报税表中得到的)5?”总共16个

更新2:

阿维纳什的答案从更新2工程伟大!你知道吗


Tags: toname命令hello颜色结尾字母forum
1条回答
网友
1楼 · 发布于 2024-04-19 04:40:19

你需要使用一个不贪婪的正则表达式。你知道吗

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

如果您不想打印最后一个空的空间,那么添加一个肯定的lookahead断言。你知道吗

>>> 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

相关问题 更多 >