【问题标题】:match non-greedy regex delimiters匹配非贪婪的正则表达式分隔符
【发布时间】:2013-03-08 11:42:14
【问题描述】:

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

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

我在整个文本中多次出现这种模式。我想从分隔符中提取some text。如何使用正则表达式做到这一点?

例如,如果我有这样的文字:

Lorem Ipsum 只是印刷和排版行业的虚拟文本。自 1500 年代以来,Lorem Ipsum 一直是行业的标准虚拟文本,当时一位不知名的印刷商采用了一种类型的厨房并将 {# xxx #} 它加扰以使 {# zzz #} 成为一本类型样本书。它不仅经历了五个世纪,而且经历了电子排版的飞跃,基本保持不变。它在 1960 年代 {# xxx #} 与 {# zzz #} 发布了包含 Lorem Ipsum 段落的 Letraset 表,最近在 {# 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 #}

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

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您只需在分隔符之间添加? 即可获得非贪婪行为。另外,最后不应该有.*?。它什么也没做。 {} 是特殊字符,可能应该被转义。最后,括号需要围绕您要匹配的部分。这给了你这个模式:

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

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

    【讨论】:

    • 哇,太不可思议了!为什么 {# xxx #}{# zzz #} 不包含在结果匹配中?
    • @turtle,查看关于使用它获取子组的更新说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    • 2011-08-29
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多