• 正则表达式与re模块


    一 .正则表达式与re模块的关系

    正则表达式(regular expression)是对字符串数据的处理

    re是python中的一个模块

    1.正则模式是一门独立的技术,大多编程语言都支持使用

    2.Python中想要使用正则表达式,需要先导入re模块

    二.正则表达式

    字符组:在一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示(不加量词,一个字符组匹配一个字符)  

    [0-9]  匹配0-9的数字
    [a-z]  匹配a-z的小写字母
    [A-Z] 匹配A-Z的大写字

      ps:字符组必须依据ascii的顺序,从小到大排列。内部是转换成ASCII码来比较的

      元字符:

      .       匹配除换行符以外的任意字符
      w   匹配字母或数字或下划线
      s   匹配任意的空白符
      d   匹配数字
      W   匹配非字母数字或下划线
      S   匹配非空白符
      D   匹配非数字
         匹配换行符
         匹配制表符
         匹配单词结尾
      ^   以什么开头
      $   以什么结尾
      a|b   匹配a或b
      ( )   括号内的p式,可以看成一个组
      [...]   匹配字符组中的字符
      [^..]   匹配字符组中以外的字符

      

     

        

      

      使用技巧:

    w,s,d与W,S,D有相反的匹配关系,对应的两者同时使用可以匹配所有字符

    ^与$连用能够精准匹配固定长度的目标字符,^只能出现在开头,$只能出现结尾

        abc|ab使用或是建议长的字符串在前

        

      量词 :限制单个字符匹配的个数。

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

      

      

      ps:量词写在某个字符组或字符之后,只对单个字符有效

      转义字符 :

      用转义字符可以把特殊的元字符进行转义,在python中,在字符串前加r(raw)表示原生字符串即可

      正则模式的贪婪模式与惰性模式

      正则表达式会默认为贪婪模式,在满足匹配条件的情况下,尽可能多的匹配字符串。

      非贪婪模式:加上?会将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串

      

      非贪婪模式

    *? 重复任意次,但尽可能少重复
    +? 重复1次或更多次,但尽可能少重复
    ?? 重复0次或1次,但尽可能少重复
    {n,m}? 重复n到m次,但尽可能少重复
    {n,}? 重复n次以上,但尽可能少重复

     

    .*?x意思是取前面任意长度的字符,直到一个x出现

     

    三.re模块

    三个必须掌握的方法:findall,search和match。

    findall:第一个参数是正则表达式,第二个参数是待匹配的字符串

    import re
    
    ret = re.findall('[a-e]', 'eva egon yuan')  
    
    print(ret) #['e', 'a', 'e', 'a']# 返回所有满足匹配条件的结果,放在列表里
    View Code

    search:

    import re
    ret = re.search('e', 'eva egon yuan')
    print(ret) # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象
    if ret :
        print(ret.group())# # 该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
    # 并且需要注意的是如果ret是None,再调用.group()会直接报错。这一易错点可以通过if判断来进行筛选
    View Code

    match:

    import re
    ret = re.match('a', 'abc') # 同search,不过尽在字符串开始处进行匹配
    print(ret)
    if ret :
        print(ret.group())
    # match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个对象,需要用group才能显示
    # 如果没匹配上就返回None,调用group()就会报错
    View Code

    其他方法:

    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

    分组优先;

    search,mach分组优先

    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机制
    View Code

    findall 分组优先

    # 而针对findall它没有group取值的方法,所以它默认就是分组优先获取的结果
    ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
    View Code

    取消分组优先 

     方法分组里加?:

    ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')  # ?:取消分组优先
    View Code

    起别名

    分组中利用?P<name>的形式给分组起名字

    ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
    #还可以在分组中利用?P<name>的形式给分组起名字
    #获取的匹配结果可以直接用group('名字')拿到对应的值
    print(ret.group('tag_name'))  #结果 :h1
    View Code
  • 相关阅读:
    【ImageMagick】ImageMagick命令行工具
    MAC 下安装PIL
    【转】tmux入门指南
    python编码和小数据池
    ----------BMI指数小程序----------
    ----------简单购物车小程序----------
    python基础数据类型3
    python基本数据类型2
    python基本数据类型
    python循环
  • 原文地址:https://www.cnblogs.com/Cpsyche/p/11202450.html
Copyright © 2020-2023  润新知