美文网首页
正则表达试学习

正则表达试学习

作者: dongshangtong | 来源:发表于2019-06-03 09:46 被阅读0次
    1. 字符数组 []
    正则 待匹配字符 匹配结果 说明
    [0123456789] 8 True 在一个字符组里枚举合法的所有字符,字里的任意一个字符和"待匹配字符"相同都视为可以匹配
    [0123456789] a False 由于字符组中没有"a"字符,所以不能匹配
    [[0-9] 7 True 也可以用-表示范围,[0-9]就和[0123456789]是一个意思
    [a-z] s True 同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
    [A-Z] B True [A-Z]就表示所有的大写字母
    [0-9a-fA-F] e True 可以匹配数字,大小写形式的a~f,用来验证十六进制字符

    2.元字符

    元字符 匹配内容
    \d 匹配数字
    \w 匹配字母或数字或下划线
    \s 匹配任意的空白符
    \D 匹配非数字
    \W 匹配非字母或数字或下划线
    \S 匹配非空白符
    注意,上面6字符 刚好两两相反,为了方便记忆
    \b 匹配一个单词的结尾
    \n 匹配一个换行符
    \t 匹配一个制表符
    . 匹配除换行符以外的任意字符
    ^ 匹配字符串的开始
    $ 匹配字符串的结尾
    a b 匹配字符a或字符b
    () 匹配括号内的表达式,也表示一个组
    [...] 匹配字符组中的字符
    [^...] 匹配除了字符组中字符的所有字符

    3.量词

    量词 用法说明
    * 重复零次或更多次
    + 重复一次或更多次
    ? 重复零次或一次
    {n} 重复n次
    {n,} 重复n次或更多次
    {n,m} 重复n到m次

    一些总结


    62A014543E3089429726E418D75BDA81.png

    下面是一些例子
    字符串 匹配
    findall

    ret = re.findall('\d+','19874ashfk01248')
    print(ret)  # 参数 返回值类型:列表 返回值个数:1 返回值内容:所有匹配上的项
    ret1 = re.findall('\s+','19874ash   fk01248  ')
    print(ret1)
    

    search

    ret2 = re.search('^\d+','@19874ashfk01248')
    print(ret2) #  返回值类型: 正则匹配结果的对象  返回值个数:1 如果匹配上了就返回对象
    if ret2:print(ret2.group()) # 返回的对象通过group来获取匹配到的第一个结果
    ret3 = re.search('\s+','19874ashfk01248')
    print(ret3) #  返回值类型: None   如果没有匹配上就是None
    

    match

    ret4 = re.match('\d+','19874ashfk01248')
    print(ret4.group())
    ret5 = re.match('%\d+','%19874ashfk01248')
    print(ret5.group())
    

    match 相当于 search 在正侧前边加^, 所以下面就比配不到了

    ret2 = re.search('^\d+','@19874ashfk01248')
    print(ret2)
    

    sub 意思是替换 ,跟replace 差不多一样

    print('replace789,24utdeedeeeeshf'.replace('e','H',3)) #  意思是匹配3个替换掉
    ret = re.sub('\d+','H','replace789nbc2xcz392zx')
    print(ret)
    ret = re.sub('\d+','H','replace789nbc2xcz392zx,48495',3) # 意思是匹配1个替换掉
    print(ret)
    

    subn
    ** subn 比 sub 结果多了统计比配多少个字

    ret = re.subn('\d+','H','replace789nbc2xcz392zx')
    print(ret)
    ('replaceHnbcHxczHzx', 3)  #subn  比 sub 结果多了统计比配多少个字符
    

    切割

    split

    print('alex|83|'.split('|'))
    ret = re.split('\d+','alex83egon20taibai40')
    print(ret)
    

    在括号里取消优先显示是多加?:

    # 实例:
    edit_name = re.findall(r'(?:\d+?).+(?:\d+?) ',fl_name)
    

    分组命名

    ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>")
    print(ret.group('name'))  #结果 :h1
    # print(ret.group())  #结果 :<h1>hello</h1>
    
    ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
    print(ret.group(1))
    # print(ret.group())  #结果 :<h1>hello</h1>
    
    ret = re.search(r'<(?P<tag>\w+)>(?P<c>\w+)</(\w+)>',r'<a>wahaha</b>')
    print(ret.group())
    print(ret.group('tag'))
    print(ret.group('c'))
    

    进阶方法 - 爬虫\自动化开发

    compile ***** 时间效率

    re.findall('-0\.\d+|-[1-9]+(\.\d+)?','alex83egon20taibai40')  #--> python解释器能理解的代码 --> 执行代码
    ret = re.compile('-0\.\d+|-[1-9]\d+(\.\d+)?')
    res = ret.search('alex83egon-20taibai-40')
    print(res.group())
    
    节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率

    finditer ***** 空间效率

    print(re.findall('\d','sjkhkdy982ufejwsh02yu93jfpwcmc'))
    # ['9', '8', '2', '0', '2', '9', '3']
    ret = re.finditer('\d','sjkhkdy982ufejwsh02yu93jfpwcmc')
    for r in ret:
        print(r.group())
    # 结果:
    # 9
    # 8
    # 2
    # 0
    # 2
    # 9
    # 3
    

    相关文章

      网友评论

          本文标题:正则表达试学习

          本文链接:https://www.haomeiwen.com/subject/qphqxctx.html