一个正则表达式可以实现吗?

时间:2013-02-15 14:50:59

标签: regex

我有一个像

这样的字符串
{! 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。哦,小男孩!”]

我仍然对正则表达式缺乏经验,所以我不明白为什么这不起作用。我认为它会匹配'{!'接下来是任意数量的字符,直到你得到一个可能不存在的括号(非贪婪)。

4 个答案:

答案 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)

你可以这样做:

({![^}]+}?)

Regular expression image

Edit live on Debuggex

然后恢复对应于第一组括号的捕获组$1

使用这种方式,您必须使用“全部匹配”类型的函数,因为正则表达式本身与单个组函数匹配

这种方式不会使用任何环顾四周。此外,^}的使用应限制正则表达式引擎周期的数量,因为它正在搜索下一个}作为断路器,而不是必须执行整个表达式然后回溯。

答案 3 :(得分:1)

如果您的工具/语言支持perl正则表达式,请尝试以下操作:

(?<={!)[^}]*