首页 文章

捕获文本直到第一次出现[保留]

提问于
浏览
-5

这是一个示例文本文件,我想从“最终输出”中捕获文本,直到第一次出现“DEBUG”

DEBUG: Fri Dec  7 06:49:14 2018:16920 final output is [ abc
1243 -/$> li
text te5%1][
;
done
DEBUG:

预期产量:

[ abc
1243 -/$> li
text te5%1][
;
done

我的正则表达式:

DEBUG.*final output is ([a-z \n]*)DEBUG

这仅适用于字母,但输出是字母,字母,数字的组合 . 有没有办法继续捕获,直到第一次出现DEBUG

3 回答

  • 1

    使用 LookbehindLookahead

    Ex:

    import re
    
    text = """DEBUG: Fri Dec  7 06:49:14 2018:16920 final output is [ abc
    1243 -/$> li
    text te5%1][
    ;
    done
    DEBUG:"""
    
    print(re.findall(r"(?<=final output is).*?(?=DEBUG)", text, flags=re.DOTALL))
    

    Output:

    [' [ abc\n1243 -/$> li\ntext te5%1][\n;\ndone\n']
    
  • 0

    你的正则表达式不起作用的原因是因为character class不包含字符串中的所有字符 .

    您可以将角色类更新为 [][/$%>;a-z0-9 \n-] . 你的正则表达式看起来像:

    DEBUG.*final output is ([][/$%>;a-z0-9 \n-]*)DEBUG
    

    您的比赛是在第一个捕捉组中 .

    如果你想使用点匹配任何字符而不是包含换行符的字符类,你可以使用标志 re.DOTALLdemo)和这个正则表达式:

    DEBUG.*?final output is (.*?)DEBUG
    

    例如:

    import re
    
    s = """DEBUG: Fri Dec  7 06:49:14 2018:16920 final output is [ abc
    1243 -/$> li
    text te5%1][
    ;
    done
    DEBUG:"""
    
    print(re.findall(r"DEBUG.*final output is ([][/$%>;a-z0-9 \n-]*)DEBUG", s))
    

    regex demoPython demo

  • 0

    你可以试试这个

    ^(?:DEBUG.*?)(?<=final output is )[\w\W]+(?=DEBUG)
    

    Explanation

    • ^ - 锚定字符串的开头 .

    • (?:DEBUG.*?) - 非捕获组 . 匹配DEBUG后跟任何零或更多时间,除了新行(延迟模式) .

    • (?<=final output is) - 正向后卫匹配 final output is .

    • [\w\W]+ - 一次或多次匹配任何角色 .

    • (?=DEBUG) - 积极的lokkahead . 赛事 DEBUG

    Demo

相关问题