python之re模块

一、re模块与正则表达式

    今天我们要整理python里的re模块和正则表达式,正则表达式不仅在python领域,在整个编程届都占有举足轻重的地位。

  在没有正式介绍re模块之前我们需要先了解一下什么是正则表达式,它又与re模块有什么联系呢?

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

  正则表达式的用法   

   元字符
    w 匹配数字字母下滑线 word关键字 [a-zA-Z0-9_]
    d 匹配所有的数字 digit [0-9]
    s 匹配所有的空白符 回车/换行符 制表符 空格 space [ ]
        匹配换行符 回车
        匹配制表符 tab
        匹配空格
      W D S 和w d s取反
      [sS] [dD] [wW]是三组全集 意思是匹配所有字符
       表示单词的边界

        和转义字母相关的 元字符
      w d s( )  W D S

     ^ 与$
       ^ 匹配一个字符串的开始
       $ 匹配一个字符串的结束
  
    . 表示匹配 除换行符之外的所有字符

    [] 只要出现在中括号内的内容都可以被匹配
    [^] 只要不出现在中括号中的内容都可以被匹配
    有一些有特殊意义的元字符进入字符组中会回复它本来的意义 : . | [ ] ( )


    a|b 或 符合a规则的或者b规则的都可以被匹配
     如果a规则是b规则的一部分,且a规则比b规则要苛刻/长,就把a规则写在前面
    将更复杂的更长的规则写在最前面
    () 分组 表示给几个字符加上量词约束的需求的时候,就给这些量词分在一个组


  量词
    {n}表示 这个量词之前的字符出现n次
    {n,} 表示这个量词之前的字符至少出现n次
    {n,m} 表示这个量词之前的字符出现n-m次
    ? 表示匹配量词之前的字符出现 0次 或者 1次 表示可有可无
    + 表示匹配量词之前的字符出现 1次 或者 多次
    * 表示匹配量词之前的字符出现 0次 或者 多次

二、re模块的使用

  首先我们在使用模块的时候先要导入模块,这时必不可少的步骤。

    1.findall   匹配列表中的每一个元素

1 import re
2 s="q6we798qw76sa45f"
3 ret=re.findall("d",s)
4 print(ret)
5 #运行结果['6', '7', '9', '8', '7', '6', '4', '5']

    2.search  只会匹配到第一个符合的表达式(从左到右的顺序),得到的不是直接的结果,需要用group()方法来查看。这里需要注意当没有匹配到符合

   的表达式,直接打印会显示None,而通过group()方法来查看会报错

1 import re
2 s="as4d98qw7e"
3 ret=re.search("d",s)
4 print(ret)  #运行结果:<_sre.SRE_Match object; span=(2, 3), match='4'>
5 print(ret.group())  #运行结果: 4

     findall 与 search 他们的用途都是用来查找,二者的区别在于findall 可以匹配全部结果,而search 只能匹配第一个结果。

    3.match 大体上与 search 用法相同,而不同点则是match默认在表达式前有 "^" 开头符号

import re
s = "123python456"
re1 = re.search("d+$",s)
re2 = re.match("d+$",s)
print(re1.group())   #运行结果 : 456
print(re2.group())     #报错 因为 match 在正则表达式前默认存在一个^,所以字符串s不是以数字开头数字结尾。

    4.split  切割.   

1 import re
2 s = "123python456"
3 ret = re.split("d$",s)
4 print(ret)    #运行结果:['123python45', '']

       5.sub 与 subn   替换   

import re
s= "123python456"
re1 = re.sub("d","H",s)
print(re1)    #运行结果 :HHHpythonHHH
re2 = re.subn("d","H",s)
print(re2)     #运行结果 :('HHHpythonHHH', 6)    subn会返回一个元组,元组中的第二个元素是替换的次数

    6.compile 编译  

      compile的作用是将正则表达式编译为字节码,当多次使用时不会多次便宜,它的特点就是节省时间

1 import re
2 s = "laixue1python2HAPPY"
3 obj1= re.compile("d")
4 re1 = obj1.findall(s)
5 print(re1)    #运行结果 : ['1', '2']
6 
7 obj2 = re.compile("[a-z]+")
8 print(obj2.search(s).group())   #运行结果: laixue

    7.finditer  返回一个存放匹配结果的迭代器,可以通过group()方法来查看结果,它的特点就是减少空间内存

 1 import re
 2 
 3 s = "13245python"
 4 ret = re.finditer("[a-z]",s)
 5 print(ret)    # 运行结果 :<callable_iterator object at 0x000001BADC72EAC8>  已经可以看出是迭代器了
 6 
 7 if ret.__iter__():
 8     print(True)
 9 else:
10     print(False)
11 # 判断返回是否为迭代器   运行结果为True
12 
13 print([i.group() for i in ret ])   #运行结果 :  ['p', 'y', 't', 'h', 'o', 'n']   所以finditer 可以用groud()方法来查看结果

  分组 ( )在re模块中的使用

     分组 ( ) 在正则表达式中表示分组将多个表达式统一管理后接量词来用,而在python的re模块中 " ( ) "有着不一样的用法

  1.分组 ( ) 表示优先级  

      在search中使用

1 import re
2 s = "132python456"
3 ret = re.search("d+([a-z]+)d+",s)     
4 print(ret.group())    #运行结果 : 132python456
5 print(ret.group(1))     #运行结果 ; python
6 #  当我们在表达式中添加分组表示优先级时,通过在group() 方法中添加参数可以优先获得结果

      在findall中使用

1 import re
2 s = "123python456"
3 # ret = re.findall("d+([a-z]+)d+",s)
4 # print(ret)     #  运行结果 : ['python']
5 #  当 ( ) 在findall中使用时,而无法使用group()方法查看结果,这时默认匹配出( ) 内的结果
6 ret = re.findall("(d+)([a-z]+)d+",s)
7 print(ret)     # 运行结果 : [('123', 'python')] 
8 #   当 多个( )同时使用时,会将结果以元组的形式添加到列表中

      在split中使用

1 import re
2 s = "132python456"
3 ret = re.split("^d+([a-z]+)",s)
4 print(ret)   #运行结果 : ['', 'python', '456']
5 #  在split中使用时() 内的表达式被切割后会留下来。

  2.取消 分组( ) 优先级  " ?:"

import re
s = "123python456"
ret = re.findall("(d+)(?:[a-z]+)(d+)",s)
print(ret)      #运行结果 : [('123', '456')]
#   当在( ) 内开头加入" ?: "字符时 , 表示取消优先级  

  3.分组( ) 的命名   " ?P< >"     

1 import re
2 s = "123python123"
3 ret = re.search("(?P<a>d+)([a-z]+)(?P=a)",s)
4 print(ret.group(0))  # 运行结果 : 123python123
原文地址:https://www.cnblogs.com/qq631243523/p/9490374.html