匹配非贪婪正则分隔符

0 投票
1 回答
646 浏览
提问于 2025-04-17 18:24

我有一段文字,其中一些内容是用特定符号分隔的:

{# 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,因为这样你只能得到子组的最后一个匹配结果。

撰写回答