我有一个像
这样的字符串{! texthere }
我希望在{!直到结束或你到达第一个}。所以,如果我有
{!text here} {!text here again} {!more text here。哦,孩子!
我希望[“{{text here}”,“{{text here again}”,“{!more text here.oh boy!”]
我认为这会起作用
{!*} ...
但上面的字符串会出现[“{{text here} {{text here again} {{more text here here。哦,小男孩!”]
我仍然对正则表达式缺乏经验,所以我不明白为什么这不起作用。我认为它会匹配'{!'接下来是任意数量的字符,直到你得到一个可能不存在的括号(非贪婪)。
答案 0 :(得分:5)
使用positive lookbehind (?<={!)[^}]+
:
In [8]: import re
In [9]: str="{!text here} {!text here again} {!more text here. Oh boy!"
In [10]: re.findall('(?<={!)[^}]+',str)
Out[10]: ['text here', 'text here again', 'more text here. Oh boy!']
如果跟随}
,那么在任何非{!
字符匹配的情况下,这是积极的看法。
答案 1 :(得分:2)
我相信你想使用一个不情愿的量词:
{!.*?}?
这会导致.
在找到第一个}
后立即停止匹配,而不是最后一个。
我有一个关于贪婪和不情愿量词的问题,答案很好here。
另一种选择是指定允许在两个花括号之间出现的字符,如下所示:
{![^}]*}?
这指定在您的模式中不能匹配右手大括号。
答案 2 :(得分:2)
你可以这样做:
({![^}]+}?)
然后恢复对应于第一组括号的捕获组$1
。
使用这种方式,您必须使用“全部匹配”类型的函数,因为正则表达式本身与单个组函数匹配
这种方式不会使用任何环顾四周。此外,^}
的使用应限制正则表达式引擎周期的数量,因为它正在搜索下一个}
作为断路器,而不是必须执行整个表达式然后回溯。
答案 3 :(得分:1)
如果您的工具/语言支持perl正则表达式,请尝试以下操作:
(?<={!)[^}]*