【问题标题】:python regex find contents between consecutive delimiterspython 正则表达式在连续分隔符之间查找内容
【发布时间】:2020-08-02 02:25:05
【问题描述】:

所以我有以下文字:

a
111
b
222
c
333
d

我想捕获这些字母分隔符之间的所有内容。所以我尝试了

import re
test_str=r"""a
111
b
222
c
333
d
"""
res = re.findall(r"[a-z]{1}\n([\d\D]+?)\n[a-z]{1}", test_str)

请注意,[\d\D] 适用于任何字符包括换行符,因为在实际示例中,两者之间的内容可能很复杂并且包含很多行。无论如何,我的预期输出是

['111', '222', '333']

但是,实际结果是

['111', '333']

我猜测的原因是,当第一次出现a\n111\nb匹配时,不知何故被从字符串中“带走”,没有进入后续的匹配过程,导致报错。

有没有什么简单的方法可以捕捉这些连续分隔符之间的内容?提前致谢。

【问题讨论】:

  • P.S,{1} 是多余的...
  • regex-lookbehind-and-lookahead - 他们不会“消耗”比赛
  • @Sushanth 感谢您的评论。但是test_str 只是一个玩具示例。我真正的问题涉及文本,其中之间的内容实际上可以是任何东西,而不仅仅是数字。

标签: python regex


【解决方案1】:

您可以改用(积极的)前瞻:

r"(?s)[a-z]\n(.+?)(?=[a-z])" 

它不消耗匹配的部分,只是确保可能存在匹配。

res = re.findall(r"(?s)[a-z]\n(.+?)(?=[a-z])", test_str) # ['111\n', '222\n', '333\n']

https://regex101.com/r/6FEFkZ/2Python regex lookbehind and lookahead

【讨论】:

    【解决方案2】:

    此解决方案不会使用正则表达式,但简单易懂

    import string
    teststr = """
    111
    a
    222
    b
    333
    """
    print([i for i in teststr.split('\n') if i not in string.ascii_lowercase])
    

    【讨论】:

    • (而且可能更快..)
    • 感谢您的回答,它非常适合测试示例。但我真正的问题涉及文本,其中之间的内容实际上可以是任何东西,而不仅仅是数字。
    • 什么是“任何东西”
    • 这将很快运行,并且适用于分隔符为小写字母的任何情况。无论换行符的数量如何,它都会起作用。无论内容中是否存在字母,它都会起作用
    • @AryanParekh 不幸的是,分隔符可能不仅仅是字母......它可以是正则表达式模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多