zoukankan      html  css  js  c++  java
  • re和正则表达式

    正则表达式:

    正则表达式与re的关系

    正则表达式是一门独立的技术,适用于任何语言

    但在python'中使用正则表达式将必须借助re模块

    正则表达式就是一堆有语法的字符,用于匹配字符串中符合规则的内容

    字符组:

    在同一位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示

    字符分很多种,比如数字,字母,标点等等。[ ]里面是或的关系

    [012345678] 检查匹配字符里面所有符合字符组里面的字符的单个字符
    [0-9] 匹配0到9的数字
    [a-z] 匹配a到z的所有小写字母
    [A-Z] 匹配A到Z的所有大写字母

    字符

    元字符 匹配内容
          . 匹配除换行符以外的任意字符
     w 匹配字母,数字,或下划线
       W 匹配非字母,数字,下划线
      d 匹配0到9的数字字符
      D 匹配非0到9的字符
       s 匹配任意的空白符
       S 匹配任意的非空白符
        匹配一个换行符
        匹配一个制表符(tab键)
      ^ 匹配字符串的首位字符
       $ 匹配字符串的末尾
       匹配一个单词的结尾
     [....] 匹配字符组里面的字符
     [^....] 匹配非字符组里面的字符
      a|b 匹配a或b注意把长的放前面
     () 匹配括号内的表达式,也表示一个组

          量词

          * 重复0次或多次
         + 重复一次或多次
         ? 重复0次或1次
       {n} 重复n次
       {n,} 重复n到更多次
       {n,m} 重复n到m次

    贪婪匹配与非贪婪匹配

    贪婪匹配就是尽可能匹配多个

    注:正则表达式默认就是贪婪模式(尽可能匹配多的)

    非贪婪匹配:

      就是尽可能匹配少的,要想将贪婪模式改为非贪婪模式只需要在量词后面加?就可以将贪婪模式改为非贪婪模式

    转义符:

    在正则表达式中,有很多有特殊意义的元字符比如 和s,如果要正则中匹配正常的 就需要对进行转义,变成'\'

    贪婪匹配:

    正则 待匹配字符 匹配结果  
    <.*> <script>...<script> 从头开始匹配然后倒退到第一个>结束  
    <.*?> <script>...<script> 从头开始匹配到第一个>结束  

    常用的非贪婪匹配用法:

    *?  重复任意次,但尽可能少重复

    +?重复一次或更多次,但尽可能少重复

    ??重复0次或1次,但尽可能少重复

    {n,m}?  重复n到m次,但尽可能少重复

    {n,}?  重复n到更多次,但尽可能少重复

    .*?的用法:

    .是除换行符外任意字符

    *是重复0次或多次

    ?是非贪婪模式

    合在一起就是取尽量少的任意字符,一般不会这么单独写,它大多用在:.*?x

    就是取前面任意长度的字符,直到第一个x出现

    re模块下的常用方法:

    import re

    单个字符:

    re.I不区分大小写的匹配
    print(re.findall(r'a', 'abc123嘿嘿abcABC', flags=re.I))  # ['a', 'a', 'A']
    
    a|b a或b单个字符
    print(re.findall(r'a|b', 'abc123嘿嘿abcABC', flags=re.I))  # ['a', 'b', 'a', 'b', 'A', 'B']
    
    [a,b] a或,或b单个字符
    print(re.findall(r'[a,b]', 'abc,123嘿嘿abcABC', flags=re.I))  # ['a', 'b', ',', 'a', 'b', 'A', 'B']
    
    [^ab]非a及非b的所有单个字符
    print(re.findall(r'[^ab]', 'abc,123嘿嘿abcABC'))  # ['c', ',', '1', '2', '3', '嘿', '嘿', 'c', 'A', 'B', 'C']
    
    [a-z]所有单个小写字母   [A-Z]所有单个大写字母   [0-9]所有单个数字
    print(re.findall(r'[a-z]', 'abc,123嘿嘿abcABC'))  # ['a', 'b', 'c', 'a', 'b', 'c']
    print(re.findall(r'[0-9]', 'abc,123嘿嘿abcABC'))  # ['1', '2', '3']
    
    所有小写大写数字单个字符
    print(re.findall(r'[a-z]|[A-Z]|[0-9]', 'abc,123嘿嘿abcABC'))  # ['a', 'b', 'c', '1', '2', '3', 'a', 'b', 'c', 'A', 'B', 'C']
    
    print(re.findall(r'[A-Za-z0-9]', 'abc,123嘿嘿[abcABC'))  # ['a', 'b', 'c', '1', '2', '3', 'a', 'b', 'c', 'A', 'B', 'C']
    
     .会匹配除
    以为的所有单个字符
    print(re.findall(r'.', '*\_+=
     
    	'))  # ['*', '\', '_', '+', '=', ' ', '
    ', '	']
    
    re.S会让.能匹配所有单个字符
    print(re.findall(r'.', '*\_+=
     
    	', flags=re.S))  # ['*', '\', '_', '+', '=', '
    ', ' ', '
    ', '	']
    
    # d单个数字 == [0-9]
    print(re.findall(r'd', 'abc,123嘿嘿[abcABC'))  # ['1', '2', '3']
    # w == [A-Za-z0-9_]  将常见的汉字就理解为单个字母
    
    print(re.findall(r'w', 'abc,123嘿[_'))  # ['a', 'b', 'c', '1', '2', '3', '嘿', '_']
    # s == [f
    
    	v ] 单个空:空格、制表符、换页符等
    
    print(re.findall(r's', 'f
    
    	v '))  # ['x0c', '
    ', '
    ', '	', 'x0b', ' ']
    
     D就是d的对立面:非数字的所有单个字符  W就是w的对立面  S就是s的对立面
    print(re.findall(r'D', 'abc,123嘿[_'))  # ['a', 'b', 'c', ',', '嘿', '[', '_']

    三个必须掌握的方法:

      findall:匹配目标字符串并返回所有符合正则表达式的内容

      search:依据正则规则匹配到第一个就不匹配了并返回匹配到的对象,然后group()就可以拿到内容,如果没有就返回none,并且不能group获取

      match:只会匹配字符串的开头部分,然后返回,group获取,当字符串中的开头部分不符合正则规则时会返回一个none,和上面一样,另外这个一般是用来进行校验的。

    其他方法:

    ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
    print(ret)  # ['', '', 'cd']
    
    ret = re.sub('d', 'H', 'eva3egon4yuan4', 1)  # 将数字替换成'H',参数1表示只替换1个
    print(ret)  # evaHegon4yuan4
    
    ret = re.subn('d', 'H', 'eva3egon4yuan4')  # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
    print(ret)
    
    obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    print(ret.group())  #结果 : 123
    
    import re
    ret = re.finditer('d', 'ds3sy4784a')   #finditer返回一个存放匹配结果的迭代器
    print(ret)  # <callable_iterator object at 0x10195f940>
    print(next(ret).group())  #查看第一个结果
    print(next(ret).group())  #查看第二个结果
    print([i.group() for i in ret])  #查看剩余的左右结果
    View Code

    分组优先机制

    import re
    res = re.search('^[1-9]d{14}(d{2}[0-9x])?$',110105199812067023)
    print(res.group())
    print(res.group(1))  # 获取正则表达式括号阔起来分组的内容
    print(res.group(2))  # search与match均支持获取分组内容的操作  跟正则无关是python机制
    
    # 而针对findall它没有group取值的方法,所以它默认就是分组优先获取的结果
    ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
    
    ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')  # ?:取消分组优先
    print(ret)  # ['www.oldboy.com']
    View Code

    其他

    import re
    
    
    ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
    #还可以在分组中利用?<name>的形式给分组起名字
    #获取的匹配结果可以直接用group('名字')拿到对应的值
    print(ret.group('tag_name'))  #结果 :h1
    print(ret.group())  #结果 :<h1>hello</h1>
    """
    注意?P=tag_name相当于引用之前正则表达式,并且匹配到的值必须和前面的正则表达式一模一样
    """
    
    # 匹配整数
    ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))")
    print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
    
    ret=re.findall(r"d+.d*|(d+)","1-2*(60+(-40.35/5)-(-4*3))")
    print(ret) #['1', '2', '60', '', '5', '4', '3']
    ret.remove("")
    print(ret) #['1', '2', '60', '5', '4', '3']
    View Code
  • 相关阅读:
    Oracle SQL 函数
    j2me MIDP2.0 下实现split函数
    Linux Oracle 增量恢复时错误 ORA19573: 无法获得 exclusive 入队 (数据文件 5 的)
    Linux Oracle10 建立归档模式的详细过程
    j2me MIDP2.0 下实现的图片缩放函数
    linux下oracle10g建立归档模式 接连出现错误:ORA19905 ORA01078 LRM00109
    j2me下 触摸屏的开发 NetBeans 模拟器支持触摸屏
    高级程序员:你不可不知的20条编程经验(转载)
    生成规定大小的图片(缩略图生成)
    asp.net简单实现用button做按钮图片
  • 原文地址:https://www.cnblogs.com/xinfan1/p/11202995.html
Copyright © 2011-2022 走看看