zoukankan      html  css  js  c++  java
  • python基础13 ---函数模块3(正则表达式)

    正则表达式

    一、正则表达式的本质

      1、正则表达式的本质(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

      2、正则表达式简介

        正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分  强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是  不常用的部分。

    二、正则表达式元字符。(.  * + ? ^ $ {} [] | ())

      1、" . "表示匹配字符串中除换行符外的任意字符。

        eg:re.findall('a.','abc') #返回的结果是ab

      2、" + "表示匹配前一个子表达式一次或多次,相当于一到正无穷。{1,}

        eg:re.findall('a+','abc') #返回的结果是a

      3、" * "表示匹配前一个子表达式零次或多次,相当于零到正无穷。{0,}

        eg:re.findall('aa*','abc') #返回的结果是a

      4、" ? "表示匹配前一个子表达式零次或一次,相当于零和一。{0,1}

        eg:re.findall('aa?','abc') #返回结果为a

      5、" ^ "(脱字符)表示匹配字符串开始的位置,也就是说只有目标字符串出现在开始位置才会匹配。

        eg:re.findall('^ab','abcabcabc') #返回的结果是ab

      6、" $ "(美元符)表示匹配字符串的末尾位置,也就是说只要目标字符串出现的末尾的位置才会匹配。

        eg:re.findall('bc$','abcabc') #返回的结果为bc

      7、" {x,y} "(大括号)表示匹配前面一个子表达式至少为x次最多为y次,其中x,y都为非负数,x<y。

        eg:re.findall('a{2,4}','abcaaaabc') #返回的结果为aaaa

      8、" [x,y] "(中括号)表示匹配中括号里面任意一个字符,如果匹配成功则返回结果,其中中括号内所有特殊字符都失去作用,只有“-”,“”,“ ^ ”有其特殊意义。

        eg:re.findall('a[b,c,d]c','abcadcafc') #返回的结果为abc,adc

      注意:-在中括号中表示范围,^在中括号中表示取反,在中括号中保留其原来功能。

      9、" () "表示将需要匹配的字符分组,匹配小括号中的正则表达式,或者指定一个子集的开始和结束位置(该功能主要和[0-9]使用)。

        eg:re.findall('r(ge)g','fagrgeg5654yg5h54t3') #返回结果为ge

        eg:re.findall('r(:?ge)g','fagrgeg5654yg5h54t3') #返回结果为rgeg

        eg:re.search('r(ge)1','fagrgege5654yg5h54t3') #返回结果为gege

        eg:ret=re.search(r"-blog-aticles-(?P<year>20[01]d)-(?P<month>d+)","-blog-aticles-2015-04")#P是大写的

          print(ret.group("year"))

      10、"x|y"表示匹配正则表达式x或者正则表达式y.一般情况是和小括号连用

        eg:re.findall('ac|bc','abcdefg') #返回的结果为bc

        eg:re.findall('a(?:b|c)d','acdbcdefg') #返回的结果为acd

      11、" "反斜杠在表达式中的作用最为广泛,它既可以将一个普通字符转换为一个特殊字符,也可以把一个特殊字符转换为一个普通字符(相当于解除元字符的特殊功能),如果反斜杠后面跟数字他有两种用法,如果数字为1-99表示引用序号的子字符串所匹配的字符串,如果数字是0开头或者为三位数字(092,123),那么他会把这个三位数字当作一个八进制来看待(主要是把这个八进制转换成ASCII表对应的字符,ASCII编码表共有127个字符)。

        eg:re.findall('d+','afew3223fef45t') #返回结果为3223,45

        eg:re.findall(r'\d','fawefdfwa')  #返回的结果为\d

        eg:re.search('(ge)1','fagrgege5654yg5h54t3') #返回结果为ge 相当于re.search('gege','fagrgege5654yg5h54t3') #返回结果为gege

      注释:d 匹配任何十进制数; 它相当于类 [0-9]。

           D 匹配任何非数字字符; 它相当于类 [^0-9]。

           s 匹配任何空白字符; 它相当于类 [ fv]。

         S 匹配任何非空白字符; 它相当于类 [^ fv]。  

         w 匹配任何字母数字下划线字符; 它相当于类 [a-zA-Z0-9_]。

         W 匹配任何非字母数字下划线字符; 它相当于类 [^a-zA-Z0-9_]

          匹配一个特殊字符边界,比如空格 ,&,#等

    三、正则表达式模块

      1、re模块

        import re

      2、模块的使用方法

        1.re.findall(pattern,string) :该模块是返回所有匹配条件的结果放在一个列表内。

        2.re.search(pattern,string):函数会在字符串中查找模式匹配,直到找到第一个符合匹配的字符串后返回匹配的对象,其返回的结果是对象的内存地址,要想查看其匹配的  对象就必须在返回结果对象的后面加上.group()来调用其字符串,其字符串类型是个str,如果字符串没有被匹配,就返回None。

        3.re.match(pattern,string) :函数会在字符串开头查找,如果匹配成功返回该字符串的内存地址,需要用.group()调用该内存地址,返回str类型的字符串,如果没有匹配成功  则返回Nonetype

     四、正则表达式扩展。

      1、正则表达式匹配模式。

        默认情况下重复元字符(*,{},+,?)的匹配模式是贪婪匹配(会尽可能的多匹配符合规格的字符串),如果想把他改为非贪婪匹配只需要在重复元字符后面加上‘?’就可以

        例如,对于字符串abcccccccc,正则表达式是abc+会匹配整个字符串,如果abc+?则只会匹配abc

      2、re.split()的用法

        1.原型:re.split(pattern, string, maxsplit=0,flages)

              eg:s="hello23world12alex7asd"
            ret=re.split("(d+)",s) #返回的结果是['hello', '23', 'world', '12', 'alex', '7', 'asd'] 不仅以数字进行分割还把数字本身返回

            ret=re.split("d+",s)#返回结果为['hello', 'world', 'alex', 'asd'] 只以数字进行分割

        2.如果分割的字符串不符合,就返回整个字符串的list.

      3、re.sub()和re.subs()用法

        1.原型:re.sub(pattern, repl, string,count, flags)#(正则表达式,替换的新字符串,原始字符串,替换次数) #其中第二个repl可以是新的pattern,例如r'pattern'

        2.eg:ret=re.subn("w.{2,3}d","egon","hello world waad")

      4、re.compile()用法#编译正则表达式

        1.p=re.compile(‘正则表达式’)

        2.p.findall('字符串')

      5、re.finditer()用法。

        1.原型:re.finditer(pattern, string, flages)#返回的值是个可迭代对象。

          eg: import re

            ret=re.finditer('d','ds3sy4784a')

            print(ret) #<callable_iterator object at 0x10195f940>

            print(next(ret).group())

            print(next(ret).group())

  • 相关阅读:
    Requests 库
    Mac下终端配置(item2 + oh-my-zsh + solarized配色方案)
    中文名文件上传到linux服务器上以后文件名会乱码(openoffice)
    scp
    请求https前缀的网站验证SSL证书的解决方案之一
    jupyter notebook更换主题 步骤详解。
    jupyter nbextensions的 安装
    装饰器的学习 高级版-- 语法糖参数
    装饰器的学习 初级版-- 高阶函数,嵌套函数,闭包
    Python数据可视化的完整版操作指南(建议收藏)
  • 原文地址:https://www.cnblogs.com/xuanan/p/7081961.html
Copyright © 2011-2022 走看看