zoukankan      html  css  js  c++  java
  • python 的re模块与正则表达式

    正则表达式

    正则表达式是对字符串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进⾏行匹

    配和过滤.

    1. 字符组

         字符组很简单⽤用[]括起来. 在[  ]中出现的内容会被匹配, 例如:[abc] 匹配a或b或c

    [a-z] 匹配a到z之间的所有字母 [0-9]匹配所有阿拉伯数字,能够样子的写的都是按照ASCII上的编码的顺序写的

    元字符:常用的元字符

    .    匹配除换行符以外的任意字符

        匹配一个换行符

        匹配一个制表符

    s    匹配任意的空白符

    S    匹配非空白符

    w    匹配字母或数字或下划线

    W    匹配非字母或数字或下划线

    d    匹配数字

    D    匹配非数字

        匹配一个单词的结尾或开头

    a|b   匹配字符a或字符b

    ( )    匹配括号内的表达式,也表示一个组

    使用量词是可以一次匹配到多个字符

    *    重复零次或更多次{0,n}

    +    重复一次或更多次{1,n}

    ?    重复零次或一次{0,1}

    {n}    重复n次

    {n,}    重复n次或更多次

    {n,m}    重复n到m次

     在量词中的*, +,{} 都属于贪婪匹配. 就是尽可能多的匹配到结果.

    例如:我是第一个A,然后我是第二个A

    使用贪婪匹配的话是  .*A >>>直接获取的从开头到第二个A的位置

    .+也是贪婪匹配

    惰性匹配如   .*?A >>>>>获取的是从开头到第一个A的位置

    分组

    匹配15位身份证或18位身份号码eg:

    ^[1-9]d{13,16}[0-9x]$

    ^[1-9]d{14}(d{2}[0-9x])?$

    ^([1-9]d{16}[0-9x]|[1-9]d{14})$

      Python的RE 模块

    search、match、findall、finditer

    import re
    res = re.search('e','alex and excengpter')#查找关键字,搜索到第一个的时候就返回,没有返回None
    # print(type(res))#<class '_sre.SRE_Match'>
    # print(res.group())  #e
    
    res1  = re.match('al','alex')#必须是从头开始匹配,搜索到第一个的时候就返回,没有返回None
    # print(type(res1))#<class '_sre.SRE_Match'>
    # print(res1.group())#al
    
    res2 = re.findall('哈把','我的天啊,哈哈啊哈啊哈哈哈')  #查找所有的匹配的结果并以列表的形式返回,如果没有就返回空列表
    res3 = re.findall('哈+','我的天啊,哈哈啊哈啊哈哈哈')
    # print(res2)#[]
    # print(res3)#['哈哈', '哈', '哈哈哈']
    res4 = re.finditer('','我的天啊,哈哈啊哈啊哈哈哈') #与findall 一样,不同的是这个返回的是迭代器
    #注意但是这个在迭代出来的时候还是需要使用group()才能显示里面的元素
    # print(type(res4))#如果finditer 没有查找到内容的话,返回的是一个空的迭代器
    for i in res4:
        print(i.group()) #还是需要使用group 才能显示里面的内容

    split的使用

    import re
    # 案例1 
    res5  = re.split('[ab]','ni shi yi ge sba sb ba') #按照a或b 进行切割
    print(type(res5))#<class 'list'>
    print(res5)#['ni shi yi ge s', '', ' s', ' ', '', '']
    res6  = re.split('([ab])','ni shi yi ge sba,sb,ba') #按照a或b 进行切割,并保留a,b
    print(type(res6))#<class 'list'>
    print(res6)#['ni shi yi ge s', 'b', '', 'a', ',s', 'b', ',', 'b', '', 'a', '']
    # 案例2
    gg = re.split(r'd+','我2是3笨4蛋')
    print(gg)
    hh = re.split(r'(d+)','我2是3笨4蛋')
    print(hh)
    View Code

    compile 的使用

    import re
    # 案例1
    aa = re.compile(r'fad+of')#从正则表达式匹配的内容每个组起名字,定义一个正则表达式的模板,并进行预加载
    cc = aa.search('hahd fajofa11111ofa')
    print(type(cc))#<class '_sre.SRE_Match'>
    print(cc.group())#fa11111of
    
    # 案例2
    bb = re.compile(r'fa(?P<gg>d+)of')   # (?P<gg>)将括号内匹配到的东西进行命名,方便以后直接通过名字进行提取括号的内容
    cc = bb.search('hahd fajofa11111ofa')
    print(cc.group())#fa11111of
    print(cc.group('gg'))#11111
    View Code

    使用正则进行替换sub、subn

    import re
    gg  = re.sub(r'd+','*将前面表达式匹配到的替换成我*','123我是有多么的爱你是笨蛋23333')#返回的是字符窜
    print(gg)
    dd = re.subn(r'd+','*将前面表达式匹配到的替换成我*','123我是有多么的爱你是笨蛋23333')#与上面的功能是一样的,
    # 但是返回的是元组,(第一个是替换后的字符串,第二个是替换的个数)
    View Code

    使用re 的制作的简单的爬虫

    from urllib.request import urlopen
    import re
    url = 'https://www.dytt8.net/html/gndy/dyzz/20181116/57793.html'
    gg = urlopen(url).read().decode('gbk')
    # print(gg)
    dd = re.compile(r'<div id="Zoom">.*?译  名(?P<name>.*?)<br />.*?片 '
                    r' 名(?P<name1>.*?)<br />.*?年  代(?P<time>.*?)<br />.*?bgcolor=.*?href="(?P<Herf>.*?)">'
    ,re.S)
    # name = dd.search(gg).group('name')
    # name2 = dd.search(gg).group('name1')
    # name3= dd.search(gg).group('time')
    name4= dd.search(gg).group('Herf')
     

     

    注意的是:

    ret = re.findall('www.(baidu|guge).com', 'www.baidu.com')

    print(ret)  # ['baidu]     这是因为findall会优先把匹配结果组内容返回,如果想要匹

    配结果,取消权限即可

    ret = re.findall('www.(?:baidu| guge).com', ' 'www.baidu.com'')

    print(ret)  # [' 'www.baidu.com'']

     

  • 相关阅读:
    C# 利用DataTable批处理数据导入数据库
    人员基础信息一体化采集系统建设方案
    定时调用WebService方法同步数据
    进程间通信
    信号
    Linux进程基础
    来自硬件男的《信号与系统》整理笔记
    shell脚本编程(ubantu)
    Linux系统c语言开发环境
    Linux系统用户管理及VIM配置
  • 原文地址:https://www.cnblogs.com/vivi0403/p/9971573.html
Copyright © 2011-2022 走看看