• 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的形式取值,能节省内存

  • 相关阅读:
    VS Code的使用
    跨平台C++ IDE
    windows CMakeLists.txt
    Windows引用opencv静态库
    【wpf】WPF程序处理多线程的两种方式
    【c#】System.Reflection.TargetInvocationException 调用的目标发生了异常/System.Threading.ThreadAbortException:正在中止线程
    【WinForm】Dev ProgressBarControl 使用汇总
    【WPF】UserControl用户控件怎么添加到Window窗体中
    【WPF】WPF无边框、窗体初始化位置与可拖拽窗体的解决方案
    【c#】未加载mscorlib.pdb/System.Reflection.TargetParameterCountException 未经处理的异常在mscorlib.dll中发生/参数计数不匹配
  • 原文地址:https://www.cnblogs.com/s593941/p/9494285.html
Copyright © 2020-2023  润新知