代码之家  ›  专栏  ›  技术社区  ›  confused00

Python/RegEx/findall:如何从匹配背后提取模式?

  •  1
  • confused00  · 技术社区  · 10 年前

    我确实研究了查找模式(?<=…),但这似乎并不能挽救比赛。

    输入:

    aaaaaaGET(abc)aaaaaa
    aaaaaaaaaaaaa
    aaaaaMATCH(00)aaaaaaa
    aaaaaaaaaaaaa
    aaaaGEX(xyz)aaaaaa
    aaaaaaGET(notneed)aaaaaa
    aaaaaaGEX(no)aaaaaa
    aaaaaaGET(nope)aaaaaa
    aaaaaaGET(AbC)aaaaaa
    aaaaaaaaaaaaa
    aaaaaaaaaaaaa
    aaaaaMATCH(01)aaaaaaa
    aaaaaaaaaaaaa
    aaaaGEX(XYz)aaaaaa
    

    输出:

    [(abc, 00, xyz), (AbC, 01, XYz]
    

    我想用 re.findall 找到所有MATCH部分,然后是GET(匹配上方)和GEX(匹配下方)后面的内容,但我无法从后面找到类似的内容。

    如果我所有相关的比赛都在MATCH之前,我会有类似的

    re.findall('MATCH\((\d*)\).*?GEX\(([A-Za-z]*)\)', text, re.DOTALL)
    

    但不确定如何返回并获取get值

    1 回复  |  直到 10 年前
        1
  •  4
  •   Avinash Raj    10 年前

    我想你想要这样的东西,

    >>> import re
    >>> s = """aaaaaaGET(abc)aaaaaa
    ... aaaaaaaaaaaaa
    ... aaaaaMATCH(00)aaaaaaa
    ... aaaaaaaaaaaaa
    ... aaaaGEX(xyz)aaaaaa
    ... aaaaaaGET(notneed)aaaaaa
    ... aaaaaaGEX(no)aaaaaa
    ... aaaaaaGET(nope)aaaaaa
    ... aaaaaaGET(AbC)aaaaaa
    ... aaaaaaaaaaaaa
    ... aaaaaaaaaaaaa
    ... aaaaaMATCH(01)aaaaaaa
    ... aaaaaaaaaaaaa
    ... aaaaGEX(XYz)aaaaaa"""
    >>> m = re.findall(r'GET.*?\(([^)]*)\)(?:(?!GET|GEX).)*?\(([^)]*)\)(?:(?!GET|GEX).)*?GEX\(([^)]*)\)', s, re.DOTALL)
    >>> m
    [('abc', '00', 'xyz'), ('AbC', '01', 'XYz')]
    

    (?:(?!GET|GEX).)* 否定前瞻检查以下三个字符 GET GEX ,如果它不存在,则只有它匹配下一个字符。