匹配非贪婪正则分隔符
我有一段文字,其中一些内容是用特定符号分隔的:
{# xxx #} some text {# zzz #}
在我的文字中,这种模式出现了很多次。我想从这些分隔符中提取出一些文本
。我该如何使用正则表达式来做到这一点呢?
比如说,如果我有以下这段文字:
Lorem Ipsum 是印刷和排版行业的虚拟文本。自从1500年代以来,Lorem Ipsum就一直是这个行业的标准虚拟文本,当时一位未知的印刷工把一组字母打乱了 {# xxx #},以制作 {# zzz #} 一本样本书。它不仅经历了五个世纪的考验,还成功地进入了电子排版,基本上没有改变。它在1960年代变得流行 {# xxx #},随着 {# zzz #} Letraset纸张的发布,其中包含了Lorem 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 个回答
2
你可以通过在分隔符之间加上?
来实现非贪婪匹配。还有,最后不要加.*?
,因为它没有任何作用。{}
是特殊字符,最好加上转义符。最后,括号要围住你想匹配的部分。这样你就得到了这个模式:
regex = re.compile(r'\{# xxx #\}(.*?)\{# zzz #\}')
要使用这个模式,你需要一个循环,里面用到类似m = re.match
的东西,然后用m.group(1)
来获取第一个子组(也就是括号里的部分)。你需要用循环,而不是findall
,因为这样你只能得到子组的最后一个匹配结果。