zoukankan      html  css  js  c++  java
  • re正则匹配之findall

    前言

    re是python的一个正则匹配库,可以使用正则表达式匹配出我们想要的内容

    findall 使用

    findall:返回字符串中所有不重叠匹配项的列表。
    findall匹配的时候,会把结果放到list返回,如果没有匹配到返回空list不会报错

    使用语法

    findall(pattern, string, flags=0)
    • pattern 匹配的正则表达式
    • string 待匹配的字符串
    • flags=0 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

    示例一:三种写法基础示例

    import re
    
    kk = re.compile(r'd+')  # 匹配数字
    res1 = kk.findall('one1two2three3four4')
    print(res1)
    # ['1', '2', '3', '4']
    
    # 注意此处findall()的用法,可传两个参数;
    kk = re.compile(r'd+')
    res2 = re.findall(kk,"one123two2")
    print(res2)
    # ['123', '2']
    
    # 也可以直接在findall传2个参数
    res3 = re.findall(r'd+', "one123two2")
    print(res3)
    # ['123', '2']

    示例二:

    匹配多个满足条件的结果,找出字符串中有多少个ab, 两个字符挨着的

    import re
    
    a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
    # 1.找出字符串中有多少个ab, 两个字符挨着
    res1 = re.findall(r"ab", a)
    print(res1)
    # ['ab', 'ab', 'ab', 'ab', 'ab']

    继续查找如ab, aab, aaab,aaaab这种,a可以重复,也就是匹配前面的a是1个或多个

    +是代表前面的字符出现1次或多次

    import re
    
    a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
    # 2.+是代表前面的字符出现1次或多次
    res1 = re.findall(r"a+b", a)
    print(res1)
    # ['ab', 'aab', 'ab', 'ab', 'aaab']

    *是代表匹配前面的字符出现0次或多次

    import re
    
    a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
    # *代表前面的字符出现0次或多次
    res1 = re.findall(r"a*b", a)
    print(res1)
    # ['ab', 'aab', 'ab', 'b', 'b', 'ab', 'b', 'b', 'aaab', 'b', 'b']

    要匹配a和b之间有一个字符的,比如aab,abb,acb,adb都符合

    .就是匹配除 (换行符)以外的任意一个字符

    import re
    
    a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
    # .就是匹配除 
     (换行符)以外的任意一个字符
    res1 = re.findall(r"a.b", a)
    print(res1)
    # ['aab', 'abb', 'abb', 'aab']

    贪婪 与 非贪婪

    接着继续查找a和b之间,可以有字符如axb,axxxb,axxxxb ,其中x是任意字符,x也可以没有字符如ab。
    但中间不能包含b,遇到b立马结束,如abcaab这种不符合,遇到第一个b就结束匹配

    符号.* 贪婪,匹配从.*前面为开始到后面为结束的所有内容

    import re
    
    a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
    # 符号.* 贪婪,匹配从.*前面为开始到后面为结束的所有内容
    res1 = re.findall(r"a.*b", a)
    print(res1)
    # ['abcaabffabbcdaccbfabbbgggaaabbb']

    符号.*? 非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取

    import re
    
    a = "abcaabffabbcdaccbfabbbgggaaabbbkk"
    # 符号.*? 非贪婪,遇到开始和结束就进行截取
    res1 = re.findall(r"a.*?b", a)
    print(res1)
    # ['ab', 'aab', 'ab', 'accb', 'ab', 'aaab']

    ()的使用

    比如我要从下面这段文本中取出百度地址, 上面学到的.*?是非贪婪匹配,可以匹配出我们想要的内容

    import re
    
    # 取出url地址
    a = '百度地址:www.baidu.com,欢迎使用!!!'
    res = re.findall(r'百度地址:.*?,欢迎使用!!!', a)
    print(res)
    # ['百度地址:www.baidu.com,欢迎使用!!!']

    如果不加括号,它会把匹配的一整串全部取出来,如果只想要中间的那段内容,可以用(.*?)

    import re
    
    # 取出url地址
    a = '百度地址:www.baidu.com,欢迎使用!!!'
    res = re.findall(r'百度地址:(.*?),欢迎使用!!!', a)
    print(res)
    # ['www.baidu.com']
  • 相关阅读:
    TOMCAT原理详解及请求过程
    详解Tomcat配置及使用
    Android网络编程(三)Volley使用方法全解析
    Android开发文档翻译之-Services
    竞赛中经常使用的C++写法
    Android消息机制
    boost的内存管理
    二叉树遍历技巧
    【 D3.js 视频系列 】 飞速入门
    [Spring实战系列](19)Servlet不同版本号之间的差别
  • 原文地址:https://www.cnblogs.com/lvhuayan/p/15259435.html
Copyright © 2011-2022 走看看