匹配非贪婪的正则表达式分隔符

时间:2013-03-08 11:42:15

标签: python regex

我有一些文字,其中一些文字由以下分隔:

{# xxx #} some text {# zzz #}

我的文字中出现过很多这种模式。我想从分隔符中提取some text。我怎么能用正则表达式做到这一点?

例如,如果我有这个文字:

Lorem Ipsum只是印刷和排版行业的虚拟文本。自16世纪以来,Lorem Ipsum一直是业界标准的虚拟文本,当时一台未知的打印机采用了类型的厨房并且混乱{#xxx#}它使{#zzz#}成为一种类型的标本书。它不仅存在了五个世纪,而且还延续了电子排版,基本保持不变。它在20世纪60年代推出{#xxx#},{#zzz#}发布包含Lorem Ipsum段落的Letraset表格,最近发布了包含Lldm Ipsum段落的{#xxx#}桌面出版软件,包括版本的Aldus PageMaker {#zzz#} Lorem Ipsum。

我希望得到一个列表:

[it to make, with, desktop publishing software like Aldus PageMaker]

这是我的非工作代码:

>>> regex = re.compile(r'{# xxx #}.*({# zzz #}).*?')

>>> re.findall(regex, s) {# zzz #}

我认为我的困难是试图以非贪婪的方式制作正则表达式?

1 个答案:

答案 0 :(得分:2)

只需在分隔符之间添加?即可获得非贪婪行为。此外,您最后不应该有.*?。它没有做任何事情。 {}是特殊字符,可能应该被转义。最后,括号需要在您想要匹配的部分周围。这给你这种模式:

 regex = re.compile(r'\{# xxx #\}(.*?)\{# zzz #\}')

要使用它,您需要一个使用m = re.match之类的循环,然后使用m.group(1)来获取第一个子组(括号中的部分)。您需要使用循环而不是findall,因为您只能获得子组的最后一个匹配。