3

我有一个字符串

{! 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. Oh boy!"]

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

4

4 回答 4

5

使用积极的后视 (?<={!)[^}]+

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

这是积极的向后看,}如果跟随,则匹配任何非字符{!

于 2013-02-15T14:54:49.270 回答
2

我相信您想使用不情愿的量词:

{!.*?}?

这将导致.一旦}找到第一个跟随者,而不是最后一个,就停止匹配。

我有一个关于贪婪和不情愿量词的问题,这里有一个很好的答案。

另一种选择是指定允许出现在两个大括号之间的字符,如下所示:

{![^}]*}?

这指定在您的模式中不能有一个右花括号匹配。

于 2013-02-15T14:53:15.250 回答
2

你可以这样做:

({![^}]+}?)

正则表达式图片

在 Debuggex 上实时编辑

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

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

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

于 2013-02-15T14:57:13.303 回答
1

如果你的工具/语言支持 perl 正则表达式,试试这个:

(?<={!)[^}]*
于 2013-02-15T14:55:51.250 回答