re模块

import re   #先导入re模块

  一个模块只会被导入一次,不管执行了多少次import,这样可以防止导入模块被一遍又一遍的执行

re模块的功能:

查找:

finall:匹配所有,每一项都是列表中的一个元素

     如:  import re  #第一步,引入re模块

         a = re.findall("匹配规则","要匹配的字符串")  #第二部,调用模块函数

         以列表形式返回匹配到的字符串

如:

1 import re#第一步,引入模块
2 ret = re.findall("d+","akhua5fsas6as456a")#第二步,调用模块函数
3 print(ret)

返回的结果为:['5','6','456']

1 import re
2 ret = re.findall("d","68a4f6a84f6a4sf")
3 print(ret)

结果为:['6','8','4','6','8','4','6','4']

search:只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法来获取结果,如果没有匹配到,会返回None,使用group会报错

1 import re
2 ret = re.search("d+","6a4d6a4f6a4s8f")
3 print(ret)#得到的是一个内存地址
4 print(ret.group())#通过ret.group()获取真正的结果

结果为:<re.Match object; span=(0, 1), match='6'>,

      #span表示的是找到的结果的索引,match表示找到的结果

    6

1 import re
2 ret = re.search("d+","jasgfajgfaf")
3 print(ret)
4 print(ret.group())

结果为:None

   AttributeError: 'NoneType' object has no attribute 'group'

match:从头开始匹配,相当于search中的正则表达式加上一个^

    也就是说,match只会从字符串的第0个位置开始匹配,匹配成功的话就返回值,如果不是从开始位置匹配成功的话就返回None

1 import re
2 ret = re.match("d+","1fa6sf4")
3 print(ret)
4 print(ret.group())

是从第0个位置匹配成功的,所以结果为:<re.Match object; span=(0, 1), match='1'>

                  1

1 import re
2 ret = re.match("d+","f1a6sf4")
3 print(ret)
4 print(ret.group())

不是从第0个位置匹配成功的,所以结果为:None,而且如果执行ret.group()会报错

字符串处理的扩展:替换,切割

1.split  切割

1 import re
2 s = "a1b1c1d1"
3 print(s.split("1"))#字符串切割
4 
5 ret = re.split("d",s)#re模块的切割
6 print(ret)

结果都为:['a', 'b', 'c', 'd', '']

2.sub 替换,返回字符串,sub(正则表达式,新的字符,原字符串,替换次数)不写替换次数默认全部替换

1 import re
2 s = "65as1as51f3a5sf1"
3 ret = re.sub("d","A",s)
4 print(ret)

结果为:AAasAasAAfAaAsfA

3.subn  替换,和sub一样,只是返回的结果是一个元组,元组中第二个元素为替换的次数

1 import re
2 s = "6f46sf16af1a"
3 ret = re.subn("d","A",s)
4 print(ret)

结果为:('AfAAsfAAafAa', 6)

re模块的进阶:时间/空间

compile  节省使用正则表达式解决问题的时间

将正则表达式编译成字节码,返回一个对象的模式,在多次使用的过程中,不会多次编译(可以把常用的正则表达式编译成正则表达式对象,这样可以提高一点效率)

  re.compile(pattern)  pattern:编译时用的表达式字符串

finditer  节省使用正则表达式解决问题的空间/内存


搜索字符串,找到所有符合正则表达式的结果并放在一个迭代器中,最终返回的是一个迭代器,可以用for循环来查看结果

1 import re
2 s = "6a84sf6a8f4"
3 ret = re.finditer("d",s)
4 for i in ret:
5     print(i.group())

结果为:6

    8

    4

    6

    8

    4

总结:

findall:返回列表,找到所有的匹配项

search:匹配到就返回一个变量,通过group取匹配到的第一个值,匹配不到就返回None,group会报错

match:相当于search的正则表达式中加了一个^,如果从第0个位置匹配成功,则返回值,否则返回   None,group会报错

split:返回列表,按照正则规则切割,默认匹配到的内容会被切掉

sub/subn:替换,按照正则规则去寻找要被替换的内容,subn返回的是元组,第二个值是被替换的次数

compile:编译一个正则表达式,用这个结果去search,match,findall,fingiter,能够节省时间

finditer:返回一个迭代器,所有的结果都在这个迭代器中,需要通过for循环加group的形式取值,能节省内存

原文地址:https://www.cnblogs.com/s593941/p/9494285.html