zoukankan      html  css  js  c++  java
  • python—RE正则表达式

    re正则表达式

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

    一、正则表达式的作用
    1、给字符串进行模糊匹配,和其它的数据类型没有任何关系
    2、对象就是字符串

    二、字符匹配(普通字符,元字符)

    1.普通字符:数字字符和英文字母和自身匹配
    2.元字符:. ^ $ * + ? {} [] () |

    import re
    re.方法("规则","匹配的字符串")
    . 匹配任意一个字符,除了 换行符

    三、匹配规则

     

    四、使用前需先导入re模块

    import re

    分别示例:

    1、re.findall的使用(配合元字符)

    (匹配的规则, 字符串) # 找到所有的匹配元素,返回列表

    示例1:.  的作用:匹配任意的意思(一个点代表一个字符,有多个字符,就用多个点代替)

    import re
    # . :匹配除
    以外的任意符号
    print(re.findall("a.+d","abcd"))#匹配的是第一个字母是a,中间是任意字符有1至无穷个,最后一个字母是b
    

    执行结果是:

    ['abcd']
    

    补充拓展:

    1 re.findall("a..x","adsfaeyxsk19")  #匹配以a开头,以x结尾的字符

    执行结果:

    1 ['aeyx']

    示例2:^:从字符串开始位置匹配;$:从字符串结尾匹配

    # ^:从字符串开始位置匹配
    # $:从字符串结尾匹配
    import re
    print(re.findall("^yuan","yuandashj342jhg234"))#以yuan开始
    print(re.findall("yuan$","yuandashj342jhg234yuan"))#以yuan结尾
    

    执行结果是:

    ['yuan']
    ['yuan']
    

    示例3:{} 想取多少次,就取多少次

    # * + ?  {} :这4个都表达的是重复
    print(re.findall("a.*d","abcd"))#匹配的是第一个字母是a,中间是任意字符有0至无穷个,最后一个字母是b
    print(re.findall("a.+d","abcshsjd"))#匹配的是第一个字母是a,中间是任意字符有1至无穷个,最后一个字母是b
    print(re.findall("a?d","bdkaaaad"))#匹配的a有0至1个
    print(re.findall("[0-9]{4}","af5324jh523hgj34gkhg53453"))#匹配的是在[0-9]中取一个数字,取出4个
    

    执行结果是:

    ['abcd']
    ['abcshsjd']
    ['d', 'ad']
    ['5324', '5345']
    

    补充:

    {0,} ==*

    1 re.findall("alex{1,}","asdhfalexx")

    执行结果:

    1 ['alexx']

     

    {1,}==+

    1 re.findall("alex{0,}","asdhfalexx")

    执行结果:

    1 ['alexx']

     

    {0,1}==?

    1  re.findall("alex{0,1}","asdhfalexx")

    执行结果:

    1 ['alex']

     

    {6} 重复6次

    1 re.findall("alex{6}","asdhfalexxxxxx")

    执行结果:

    1 ['alexxxxxx']

     

    {0,6} 重复1,2,3,4,5,6

    1  re.findall("alex{0,6}","asdhfalexx")

    执行结果:

    1 ['alexx']

    示例4:字符集 []: 起一个或者的意思

    # 字符集 []: 起一个或者的意思
    print(re.findall("a[bc]d","hasdabdjhacd"))#匹配的是第一个字母是a,第二个是b或者c,最后一个是d
    

    执行结果是:

    ['abd', 'acd']
    
    #注意: 在字符集[]内,* ,+和.等元字符都是普通符号,没有任何意义,除了 - ^ 有特殊意义,[^] 就是不是他的都匹配上

    示例5:#注意: 在字符集[]内,* ,+和.等元字符都是普通符号,没有任何意义,除了 - ^ 有特殊意义,[^] 就是不是他的都匹配上
    
    
    # 字符集 []: 起一个或者的意思
    print(re.findall("a[bc]d","hasdabdjhacd"))#匹配的是第一个字母是a,第二个是b或者c,最后一个是d
    #注意: 在字符集[]内,* ,+和.等元字符都是普通符号,没有任何意义,除了 - ^ 有特殊意义
    print(re.findall("[0-9]+","dashj342jhg234"))#-在里面是取范围的意思,表示取数字[0-9]中的一个有1至无穷次
    print(re.findall("[a-z]+","dashj342jhg234"))#-在里面是取范围的意思,表示取字母[a-z]中的一个有1至无穷次
    print(re.findall("[^d]+","d2a2fhj87fgj"))#^表示的是“非”的意思,匹配的是,非任何数字的,且出现1至无穷次
    print(re.findall("[^d]","d2a2fhj87fgj"))#第一个是转义的意思,表示的是不是“非”的数字的意思
    print(re.findall("[a.b]","d2a2.fhj87fgj"))#.在里面就是普通字符
    

    执行结果是:

    ['abd', 'acd']
    ['342', '234']
    ['dashj', 'jhg']
    ['d', 'a', 'fhj', 'fgj']
    ['2', '2', '8', '7']
    ['a', '.']
    

     

    示例6:(关于贪婪匹配和非贪婪匹配)

    #贪婪匹配
    print(re.findall("d+","af5324jh523hgj34gkhg53453"))#匹配的是数字有1至无穷个
    # #非贪婪匹配
    print(re.findall("d+?","af5324jh523hgj34gkhg53453"))#匹配的是数字有0-1个
    

    执行结果是:

    ['5324', '523', '34', '53453']
    ['5', '3', '2', '4', '5', '2', '3', '3', '4', '5', '3', '4', '5', '3']
    

    示例7:():分组,特点是只要匹配到了就不往下走了

    # ():分组,特点是只要匹配到了就不往下走了
    print(re.findall("(ad)+","adad"))#匹配的是ad出现1至无穷次
    print(re.findall("(ad)+yuan","adyuangfsdui"))#匹配的是ad出现1至无穷次,且后面是yuan
    print(re.findall("(?:ad)+yuan","addyuangfsdui"))#?:表示的是取消优先级,因为涉及到分组,优先把分组内容显示出来,匹配的只是分组的内容
    print(re.findall("(d)+yuan","adad678423yuang4234fsdui"))#匹配的是数字有1至无穷个
    

    执行结果是:

    ['ad']
    ['ad']
    []
    ['3']
    

    示例8:| :或

     # |  :或
    print(re.findall("www.(?:oldboy|baidu).com","www.oldboy.com"))
    

    执行结果是:

    ['www.oldboy.com']
    

    示例9::转义符号

    (1) 后面加一个元字符使其变成普通符号 . *(可以将有特殊符号变成普通符号)

    (2)将一些普通符号变成特殊符号 比如 d(表示的是数字)w(表示的是任意数字和字母,符号不算)

    # :转义符号
    # 1 后面加一个元字符使其变成普通符号 .  *(可以将有特殊符号变成普通符号)
    # 2 将一些普通符号变成特殊符号 比如 d(表示的是数字)w(表示的是任意数字和字母,符号不算)
    
    print(re.findall("d+.?d**d+.?d*","-2*6+7*45+1.456*3-8/4"))
    #d+.?d*表示的是数字有1至无穷个,小数点有0至1个,小数点后面的数字有0至无穷个
    #*是将*号之前的代表0至无穷个变成普通的字符乘号的意思
    #d+.?d*表示的是数字有1至无穷个,小数点有0至1个,小数点后面的数字有0至无穷个
    print(re.findall("w","$da@s4 234"))#匹配任意的字母和数字
    

    执行结果是:

    ['2*6', '7*45', '1.456*3']
    ['d', 'a', 's', '4', '2', '3', '4']
    

    示例10:

    1 re.findall("S+","hello world")   #S 匹配非空的字符

    执行结果:

    1 ['hello', 'world']

    示例11:

    (1)

    1  re.findall(r"I","I am LIST")  re的r =\ ,就相当转义两次

    执行结果:

    1 ['I']

    (2)

    1 re.findall("I\b","I am LIST")    #\转义字符

    执行结果:

    1 ['I']

     (3)python解释器\ 两个,re转义\ 两个,所以是\\ 四个

    1 re.findall("c\\l","abclerwt")    #同时匹配c和l

    执行结果:

    1 ['c\l']

     (4)

    1 re.findall(r"c\l","abclerwt")   #同时匹配c和l

    执行结果:

    1 ['c\l']

     以上都是re.findall的使用,返回的都是列表的形式

    re模块下的常用方法

    2、re.finditer的使用,返回的是可迭代的

     使用方法:re.finditer(“规则”,“字符串”)

    finditer(迭代器)当数据非常多的时候,他会把数据存在迭代器中,不会放在内存中,用一条处理一条。

    示例:

    # re.findall()
    import re
    s=re.finditer("d+","ad324das32")#匹配数字有1至无穷个
    print(s)#s是迭代器
    print(next(s).group())#next一下,取一个值
    print(next(s).group())
    

    执行结果是:

    <callable_iterator object at 0x00000000021F4048>
    324
    32
    

      

    3、search;查找,只匹配第一个结果,找到了就不继续了(search 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
    通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。)

    示例:

    # search;只匹配第一个结果
    ret=re.search("d+","djksf34asd3")
    print(ret.group())
    

    执行结果是:

    34
    

      

    4、match:只在字符串开始的位置匹配

    示例:

    ##match:只在字符串开始的位置匹配
    ret=re.match("d+","423djksf34asd3")
    print(ret.group())
    

    执行结果是:

    423
    

    re.match与re.search的区别

    re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

    5、split  分割

    示例:

    #split 分割
    s2=re.split("d+","fhd3245jskf54skf453sd")
    print(s2)
    
    s2=re.split("d+","fhd3245jskf54skf453sd",2)#2是指分隔的次数
    print(s2)
    
    ret3=re.split("l","hello yuan")
    print(ret3)
    

    执行结果是:

    ['fhd', 'jskf', 'skf', 'sd']
    ['fhd', 'jskf', 'skf453sd']
    ['he', '', 'o yuan']
    

      

    6、sub 替换

    示例:

    # #sub: 替换
    #
    ret4=re.sub("d+","A","hello 234jkhh23")#将数字替换成A
    print(ret4)
    
    ret4=re.sub("d+","A","hello 234jkhh23",1)#1表示的是将第一串数字替换成A
    print(ret4)
    

    执行结果:

    hello AjkhhA
    hello Ajkhh23
    

    补充:

    subn  第一个匹配元组,第二个匹配次数

    示例:

    ret=re.subn('d','A','alvin5yuan6')    #将数字替换成A
    print(ret)#打印的第一个是匹配元组,第二个匹配替换的次数是2次
    ret=re.subn("d", "A", "jaskd4234ashdjf5423")  # 第一个匹配元组,第二个匹配次数,8次
    print(ret)
    

    执行结果是:

    ('alvinAyuanA', 2)
    ('jaskdAAAAashdjfAAAA', 8)
    

      

    7、re.compile 编译方法

    示例:

    #compile: 编译方法
    c=re.compile("d+")
    ret5=c.findall("hello32world53") #相当于是re.findall("d+","hello32world53")
    print(ret5)
    

    执行结果是:

    ['32', '53']
    

      

    五、生产环境常见正则示例:

     1、匹配手机号

    1 phone_num = '13001000000'
    2 a = re.compile(r"^1[d+]{10}")
    3 b = a.match(phone_num)
    4 print(b.group())

     

    2、匹配IPv4

    1 # 匹配IP地址
    2 ip = '192.168.1.1'
    3 a = re.compile(r"(((1?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5])).){3}((1?[0-9]?[0-9])|(2[0-4][0-9])|(25[0-5]))$")
    4 b = a.search(ip)
    5 print(b)

     

    3、匹配E-mail

    1 email = '630571017@qq.com'
    2 a = re.compile(r"(.*){0,26}@(w+){0,20}.(w+){0,8}")
    3 b = a.search(email)
    4 print(b.group())

      

  • 相关阅读:
    SAP HUM事务代码 HUMAT 之初探
    SAP HUM 锁住一个HU?
    SAP MM 标准采购组织的分配对于寄售采购订单收货的影响
    SAP MM已经转成PO的采购申请Item依旧可以被删除?
    SAP MM A工厂下的PR可以转成B工厂下的PO?
    SAP MM 明明已经扩展供应商到采购组织下,采购订单里还是报错?
    SAP HUM 事务代码HUMO为整托做Scrap
    2018-8-29-Roslyn-静态分析
    2018-2-13-win10-UWP-等级控件
    2018-2-13-win10-uwp-改变鼠标
  • 原文地址:https://www.cnblogs.com/xuyuanyuan123/p/6797260.html
Copyright © 2011-2022 走看看