zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    js运算符优先级
    整理HTML的一些基础
    NSIS学习-Push&Pop(转发)
    NSIS学习-标记
    关于python中文报错的解决办法
    JDK和JRE的区别-zz
    ZZ-selenium RC for python环境搭建
    庞果网(最小操作数)
    python win32com在读取word文档时,遇到的问题
    python 如何将ppt和word转化为txt文档
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643606.html
Copyright © 2011-2022 走看看