推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
outman87
V2EX  ›  Python

[救救菜鸟] 怎么利用正则表达式截取 A 字符串之后 B 字符串(若存在)之前的子串

  •  
  •   outman87 · Jan 7, 2022 · 2606 views
    This topic created in 1726 days ago, the information mentioned may be changed or developed.
    Caused by: errorCode=QUERYILLEGAL0001 errorMsg= codeMsg=QRYILLEGAL0096
    Caused by: java.lang.ArrayIndexOutOfBoundsException
    以上两个字符串,想要截取(非匹配)Caused by: 之后的内容,直到遇见 errorMsg (倘若存在)。请问正则表达式应该怎么写?

    str1 = 'Caused by: errorCode=QUERYILLEGAL0001 errorMsg= codeMsg=QRYILLEGAL0096'
    str2 = "Caused by: java.lang.ArrayIndexOutOfBoundsException"
    res1 = re.findall(r'Caused by: ((?!errorMsg=).)*', str1)
    res2 = re.findall(r'Caused by: (?:(?!errorMsg=).)*', str1)
    res3 = re.findall(r'Caused by: ((?:(?!errorMsg=).)*)', str1)
    print(res1)
    print(res2)
    print(res3)
    res4 = re.findall(r'Caused by: ((?!errorMsg=).)*', str2)
    res5 = re.findall(r'Caused by: (?:(?!errorMsg=).)*', str2)
    res6 = re.findall(r'Caused by: ((?:(?!errorMsg=).)*)', str2)
    print(res4)
    print(res5)
    print(res6)

    =================== RESTART: C:\Users\anonymous\Desktop\test.py ===================
    [' ']
    ['Caused by: errorCode=QUERYILLEGAL0001 ']
    ['errorCode=QUERYILLEGAL0001 ']
    ['n']
    ['Caused by: java.lang.ArrayIndexOutOfBoundsException']
    ['java.lang.ArrayIndexOutOfBoundsException']

    三种写法:
    re.findall(r'Caused by: ((?!errorMsg=).)*', str)
    re.findall(r'Caused by: (?:(?!errorMsg=).)*', str)
    re.findall(r'Caused by: ((?:(?!errorMsg=).)*)', str)

    只有奇葩的第三种满足需求。为什么第一种得不到想要的结果?请问还有其它更“优雅”更简约的写法吗?

    感谢!!
    b1iy
        1
    b1iy  
       Jan 7, 2022
    盲猜
    regex = r"(?<=Caused\sby:)(\N+(?=errorMsg)|\N+)"
    b1iy
        2
    b1iy  
       Jan 7, 2022
    复制错了

    regex = r"(?<=Caused\sby:)(.+(?=errorMsg)|.+)"
    outman87
        3
    outman87  
    OP
       Jan 7, 2022
    @b1iy 可以用!感谢老师。前瞻基本上没用过,我自己琢磨下。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3054 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 10:50 · PVG 18:50 · LAX 03:50 · JFK 06:50
    ♥ Do have faith in what you're doing.