• Python中正则匹配使用findall时的注意事项


    在使用正则搜索内容时遇到一个小坑,百度搜了一下,遇到这个坑的还不少,特此记录一下。

    比如说有一个字符串  "123@qq.comaaa@163.combbb@126.comasdf111@asdfcom"

    想匹配出里面所有的邮箱地址,该怎么实现呢?

    写了个正则,测试一下:

    >>> import re
    >>> s  = "123@qq.comaaa@163.combbb@126.comasdf111@asdfcom"
    >>> pattern1 = "w+@(qq|163|126).com"
    >>> m1 = re.search(pattern1,s)
    >>> m1.group()
    '123@qq.com'
    

     可以看到,能够正确搜索到第一个结果,正则写得没问题,如果我想得到所有结果,自然而然就想到了用findall()方法。来试试看:

    >>> m2 = re.findall(pattern1,s)
    >>> m2
    ['qq', '163', '126']
    

     这时候估计很多人就觉得奇怪了,使用search方法能搜索到,说明正则写得没问题呀,为什么使用findall的时候结果是这个样子的?为什么结果不是整个邮箱字符串?

    查了资料才清楚一个概念,叫做捕获分组

    简单说,就是正则表示式里出现括号的时候,括号里的内容匹配到的部分是会被作为结果输出的,而不是把整个正则表达式匹配到的内容作为结果输出。

    所以,就出现了上面的结果了。

    那怎么得到想要的结果呢?在Python里,当一个分组的头部出现"?:"时,表示这是一个非捕获分组,意思就是它只是正常参与匹配过程,但不作为独立的结果进行输出。

    那么按这个写法来试试:

    >>> pattern2 = "w+@(?:qq|163|126).com"
    >>> m2 = re.findall(pattern2,s)
    >>> m2
    ['123@qq.com', 'aaa@163.com', 'bbb@126.com']
    

     取消了这个捕获分组,那么就是把整个表达式作为一个结果输出,这样才是我们预期想要的效果。

    这种情况在使用正则中的“或”匹配时是特别需要注意的,因为这时候通常会加括号,很多初学者很容易掉进这个坑,得到一个不知所谓的结果。

    当然,捕获分组这个功能本来是正常有用的,只是要用对了才行。

    比如,同样是刚才这个例子,如果只想要邮箱中的用户名部分,该怎么写正则表达式呢?

    显然就是把用户名部分加括号作为一个捕获分组就可以了。

    >>> pattern3 = "(w+)@(?:qq|163|126).com"
    >>> m3 = re.findall(pattern3,s)
    >>> m3
    ['123', 'aaa', 'bbb']
    

    对于findall()函数,其帮助是这么说明的:

    findall函数,就是说在正则匹配里,如果有分组,就仅仅匹配分组里面的内容,然后返回这个组的列表; 如果有多个分组,那就把每一个分组看成一个单位,组合为一个元组,然后返回一个含有多个元组的列表。

    分组这个功能还是比较强大的,以后会继续学习更多的部分。

    参考文章:https://blog.csdn.net/qq_42739440/article/details/81117919

  • 相关阅读:
    金额数字每隔3位用逗号区分
    tomcat结合shiro无文件webshell的技术研究以及检测方法
    python使用p12个人证书发送S/MIME加密,签名邮件
    CVE-2020-9484 tomcat session反序列化漏洞分析与复现
    Apache CommonCollection Gadget几种特殊的玩法
    weblogic t3协议回显穿透nat思路
    weblogic T3/iiop 回显分析
    ysoserial gadget之DNSURL gadget分析及实战利用
    CVE-2020-2555 weblogic 反序列化gadget 复现
    通达OA最新RCE漏洞分析
  • 原文地址:https://www.cnblogs.com/achillis/p/10353963.html
Copyright © 2020-2023  润新知