• Python正则运算符优先级re.findall('(.)*',"abc")、re.findall('(.*)',"abc")、re.findall('(.?)*',"abc")的执行结果的影响分析


    我们分别执行三个语句:

    >>> re.findall('(.)*',"abc")	       
    ['c', '']
    >>> re.findall('(.*)',"abc")
    ['abc', '']
    >>> re.findall('(.?)*',"abc")	       
    ['', '']
    >>>
    

    可以看到三个执行结果完全不同,为什么会这样呢?老猿才开始没弄明白。我们使用《妙用re.sub分析正则表达式解析匹配过程》介绍的方法parsematch来分析一下这三个匹配语句:

    >>> parsematch('(.)*',"abc")	       
    第1次匹配,匹配情况:
        匹配子串group(0): abc,位置为:(0, 3)
        匹配子串group(1): c,位置为:(2, 3)
    第2次匹配,m.lastindex=None,匹配情况:
        匹配子串group(0): ,位置为:(3, 3)
    
    可以看到“(.)*”是每次匹配一个字母,再重复匹配过程直到匹配不到字母前停止,所以最后匹配结果是字符“c”,在“c”之后是空字符串,由于*的原因也会匹配成功。
    
    >>> parsematch('(.*)',"abc")	       
    第1次匹配,匹配情况:
        匹配子串group(0): abc,位置为:(0, 3)
        匹配子串group(1): abc,位置为:(0, 3)
    第2次匹配,匹配情况:
        匹配子串group(0): ,位置为:(3, 3)
        匹配子串group(1): ,位置为:(3, 3)
    
    

    可以看到“(.*)”是第一次匹配是匹配所有字符"abc",匹配到搜索文本结束,第二次匹配空字符串也是匹配成功。

    >>> parsematch('(.?)*',"abc")	       
    第1次匹配,匹配情况:
        匹配子串group(0): abc,位置为:(0, 3)
        匹配子串group(1): ,位置为:(3, 3)
    第2次匹配,匹配情况:
        匹配子串group(0): ,位置为:(3, 3)
        匹配子串group(1): ,位置为:(3, 3)
    >>>
    

    可以看到“(.?)*”是每次匹配0-1个字符,再执行星号指定的重复匹配过程直到匹配到“c”之后,由于“abc”[3:3]也能匹配成功,因此最后匹配结果是空串。
    第2次匹配“c”之后的空串开始,也是匹配成功,因此又会匹配到空串。

    这是parsematch解析的匹配过程,但为什么会这样呢?这是由于匹配过程的优先级决定的,由于括号优先级高于“*”,因此匹配时先优先执行括号内的正则表达式匹配,括号内正则表达式匹配完之后再执行括号外的正则表达式的匹配。所以这三个才会有不同的处理结果。
    其实关于正则表达式优先级的事情老猿才开始没有意识到,正是由于这三个语句的执行结果不同才引发了老猿的关注,最终补充了正则表达式优先级的知识章节。

    本节相关知识:

    1. 关于正则表达式优先级请参考《第11.26 Python正则表达式运算符优先级》;
    2. 正则表达式解析匹配过程请参考《妙用re.sub分析正则表达式解析匹配过程》;
    3. 贪婪模式和非贪婪模式的匹配处理过程请参考《Python正则表达式W+和W*匹配过程的深入分析》的相关分析。

    老猿Python,跟老猿学Python!
    博客地址:https://blog.csdn.net/LaoYuanPython

    请大家多多支持,点赞、评论和加关注!谢谢!

  • 相关阅读:
    #啃underscore源码 一、root对象初始化部分
    LeetCode 7. Reverse Integer (JS)
    LeetCode 1.两数之和(JS)
    【安利】前端基础学习资源
    如何防止XSS攻击?
    浅谈CSRF攻击方式
    node中__dirname、__filename、process.cwd()、process.chdir()表示的路径
    解决Error: ENOENT: no such file or directory, scandir 'xxx ode-sassvendor'
    jquery中attr和prop的区别
    git stash 命令
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643606.html
Copyright © 2020-2023  润新知