• python正则表达式及RE模块


    正则表达式(匹配字符串)
    web界面正则匹配工具:
    http://tool.chinaz.com/regex/

    元字符

    .   匹配除换行符之外的任意字符
    w  匹配数字字母下划线
    d  匹配数字
    	  匹配制表符
    
      匹配换行符
    s  匹配空白符(包含,空格,制表符和换行符)
      单词的边界
    W  匹配非数字字母下划线
    S  匹配非空白符
    D  匹配非数字
    ^       匹配开始符
    $       匹配结束符
    |       或者,如果是有包含关系的,长的放左边
    []      匹配字符组,具体的范围
    [^...]  匹配非字符组中的字符
    ()      匹配括号内的是一组
    
    
    转义符
    如果在测试工具中测试正常的代码拿到python中,由于转义符的问题搞不定,那么就直接在字符串外面+r
    print('\\n')
    print('\n')
    print(r'\n')
    print(r'
    ')
    
    事例:
    www.(baidu|google).com
    [0-9] == [0123456789] #表示0到9的所有数
    [a-z]/[A-Z]     表示a到z/A-Z所有英文字母
    [A-Za-z0-9]     表示数字和大小写字母
    
    
    量词
    贪婪匹配: 尽可能多的匹配(默认模式)
    {n}     匹配n次
    {n,}    匹配至少n次至多无限次
    {n,m}   匹配至少n次至多m次
    *       匹配前面字符0次或多次
    +       匹配前面字符1次或多次
    非贪婪/惰性匹配
    ?       匹配前面字符0次或1次(.*?)
    abbbx   正则^ab+?x,如果正则是^ab+?结果则是ab
    
    
    总结
    正则表达式: 不仅仅要能匹配出对的,还要尽量避免匹配错误的,提高精准度
    分组的作用: 分组也可以和量词连用,表示这一个组遵循某个量词的约束
    
    常用的非贪婪匹配
    *?      重复任意次,但尽可能少重复
    .*?     匹配前边任意字符,尽可能少的匹配
    +?      重复1次或更多次,但尽可能少重复
    ??      重复0次或1次,但尽可能少重复
    .?x     取尽量少的任意字符,直到一个x出现

    re的功能是在python中执行正则表达式
    re模块下的常用方法
    import re
    re.findall  正则 待匹配字符串,列表,所有符合的项
    re.search    变量.group取结果,只有一项结果
    re.match     变量.group取结果,默认在正则之前加上^
    re.finditer 把匹配的结果存放在迭代器中

    re.findall('正则表达式','带匹配的字符')

    re.findall('正则表达式','带匹配的字符')
    ret = re.findall('d+','aaa83bbb38')
    print(ret)
    结果
    ['83', '38']
    事例2
    ret = re.findall('d','aaa83bbb38')
    print(ret)
    结果
    ['8', '3', '3', '8']
    
    # ?:把括号python中的分组变成了原来正则表达式中的分组
    lst = re.findall(r"a(?:d+)c", "a123456c")
    l2 = re.findall(r"a(d+)c", "a123456c") 
    print(lst)
    print(l2)
    结果
    ['a123456c']
    ['123456']

    re.finditer()   #返回一个存放匹配结果的迭代器,节省空间

    ret = re.finditer('d+','linux83admin60yuan25')
    print(ret)                  #直接打印返回的是一个迭代器
    print(next(ret).group())    #查看第1个结果
    for r in ret:               #查看剩余的结果
        print(r.group())
    结果
    <callable_iterator object at 0x000001FF0EACEBA8>
    83
    60
    25

    search 搜索, 查找
    一旦匹配到结果,直接返回,如果匹配不到结果,返回None

    ret = re.search('d','aaa83bbb38')
    print(ret)          #返回的匹配结果,而不是具体的值
    print(ret.group())  #从左到右找到第一个匹配的取出
    结果
    <_sre.SRE_Match object; span=(4, 5), match='8'>
    8
    
    ret = re.search('d+','aaa83bbb22')
    print(ret.group())
    结果
    83

    match匹配,从头开始匹配,相当于在你正则前面加了一个^

    ret = re.match('d+','83aaa222bbb38')
    print(ret.group())
    等于
    ret = re.search('^d+','83aaa222bbb38')
    print(ret)
    结果
    83

    search和match的区别:
    search查找,找到了结果就返回
    match,从头开始匹配

    案例:爬取电影天堂

    import re
    from urllib.request import urlopen
    
    content = urlopen("https://www.dytt8.net/html/gndy/dyzz/20181228/57986.html").read().decode("gbk")
    # print(content)
    
    reg = r'<div id="Zoom">.*?片  名(?P<name>.*?)<br />◎年  代(?P<years>.*?)<br />.*?◎上映日期(?P<date>.*?)<br />'+ 
    '.*?◎主  演(?P<main>.*?)◎简  介.*?<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="(?P<download>.*?)">'
    
    it = re.finditer(reg, content, re.S)    # re.S 去掉.里面的
    
    
    for el in it:
        print(el.group("name"))
        print(el.group("years"))
        print(el.group("date"))
        print(el.group("main").replace("<br />      ", ", "))
        print(el.group("download"))
    
    结果
     黄金兄弟 / 新古惑仔 / 新版古惑仔 / 黄金七十二小时 
     2018 
     2018-09-20(中国香港) / 2018-09-21(中国) 
     郑伊健 Ekin Cheng , 陈小春 Jordan Chan , 谢天华 Michael Tse , 钱嘉乐 Kar Lok Chin , 林晓峰 Jerry Lamb , 曾志伟 Eric Tsang , 佘诗曼 Charmaine Sheh , 张雅玫 Yamei Zhang <br /><br />
    ftp://ygdy8:ygdy8@yg45.dydytt.net:8373/阳光电影www.ygdy8.com.黄金兄弟.BD.720p.粤语中字.mkv
  • 相关阅读:
    机器学习概要
    Latex公式压缩
    MATLAB多项式运算
    利用MathType为公式编号并引用
    MATLAB符号对象与符号运算
    MATLAB矩阵运算
    MATLAB绘制函数图
    MATLAB程序控制语句
    MATLAB关系运算符和逻辑运算符
    Raspberry pi之wifi设置-3
  • 原文地址:https://www.cnblogs.com/wangm-0824/p/10199691.html
Copyright © 2020-2023  润新知