【问题标题】:Empty Regex response using finditer and lookahead使用 finditer 和前瞻空正则表达式响应
【发布时间】:2019-01-02 22:35:20
【问题描述】:

我在使用前瞻时无法理解正则表达式的行为。

我有一个给定的字符串,其中有两个重叠的模式(以M 开头,以p 结尾)。我的预期输出是MGMTPRLGLESLLEpMTPRLGLESLLEp。我下面的 python 代码产生了两个 empty 字符串,它们与预期的输出共享一个共同的开头。

删除前瞻(?=) 只会产生一个较大的输出字符串。有没有办法修改我的正则表达式术语以防止出现空字符串,以便我可以使用一个正则表达式术语获得两个结果?

import re

string = 'GYMGMTPRLGLESLLEpApMIRVA'

pattern = re.compile(r'(?=M(.*?)p)')
sequences = pattern.finditer(string)

for results in sequences:
    print(results.group())
    print(results.start())
    print(results.end())

【问题讨论】:

    标签: python regex string lookahead


    【解决方案1】:

    overlapping matches trick with a look-ahead 利用(?=...) 模式匹配空位置这一事实,然后拉出嵌套在前瞻中的捕获组。

    您需要明确打印出第 1 组:

    for results in sequences:
        print(results.group(1))
    

    这会产生:

    GMTPRLGLESLLE
    TPRLGLESLLE
    

    您可能希望在捕获组中包含 Mp 字符:

    pattern = re.compile(r'(?=(M.*?p))')
    

    此时您的输出变为:

    MGMTPRLGLESLLEp
    MTPRLGLESLLEp
    

    【讨论】:

    • 你完全正确!输出现在看起来符合预期。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    相关资源
    最近更新 更多