zoukankan      html  css  js  c++  java
  • 43-正则表达式(1)

    正则表达式:字符串匹配

    1.单字符表示:

    •         .     =>  通配  
      
    •         /d    =>  数字
      
             /w    =>  字母及数字
             /s    =>  空格,Tab,
    ,	这些空白符
    

    '''

    2.字符个数:

    '''
    * => 任意个(包括0)
    + => 至少一个
    ? => 0或1个
    {n} => n个
    {n,m} => n~m个
    '''

    3.组合举例:

    '''
    d{3}s+d{3,8} => 3个数字,至少一个空格,3到8数字
    '010-12345' => 它的正则是:d{3}-d{3,8}
    '''

    4.进阶:

    '''
    [0-9a-zA-Z_]: 恰好一个字符,可是09,az,A~Z,下划线。
    [0-9a-zA-Z_]+ : 至少一个以上字符
    [a-zA-Z_][0-9a-zA-Z_]* : 一个字符以及任意个字符
    [a-zA-Z_][0-9a-zA-Z_]{0, 19} 0-19个符合要求的字符 {字符的值域就是[][]这两个}
    A|B 匹配A或者B
    ^x 以x开头:比如, ^d 是必须以数字开头
    (x 以x结尾:比如 w) 是必须以数字或者字母结尾
    例如,^py$ 既要py开头又要py结尾,只能是py
    '''

    4.re模块

    s = r'ABC-001' #r前缀标识的字符串不考虑转义字符,只是代表正则里面的符号
    import re
    r1 = re.match(r'^d{3}-d{3,8}(', '010-12345') #若匹配成功,返回一个match的instance print(r1,' ') r2 = re.match(r'^d{3}-d{3,8})', '010 12345') #若失败,返回Node
    print(r2,' ')

    4.1切分字符:更加方便和强大

    s1 = re.split(r's+', 'a b c') #至少一个空格就分割
    s2 = re.split(r'[s,]+', 'a,b, c d') #至少一个空格或者,
    s3 = re.split(r'[s,;]+', 'a,b;; c d') #至少一个空格或者一个,或者一个;

    依次类推,支持很多的分隔符和分割要求

    print(s1,'; ', s2,'; ', s3,' ')

    4.2分组:提取子串

    m = re.match(r'^(d{3})-(d{3,8})$', '010-12345') #分成两组,第一组为3个数字,中间以-分割,第二组3-8个数字
    print(m,' ')
    print(m.group(0),' ') #group(0)永远是字符串本身
    print(m.group(1),' ')
    print(m.group(2),' ')

    t = '19:05:30' #合法输入是:时分秒都要求是两位,也就是00:00:00 ~ 23:59:59
    m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
    print(m,' ')
    g = m.groups()
    print(g,' ')

    4.3正则默认是贪婪匹配:匹配尽可能多的字符

    比如想匹配'102300'后面的00,

    version_1

    r1 = re.match(r'^(d+)(0*)(', '102300').groups() #第一组至少一个数字,结果直接把102300全匹配了,第二组结尾任意个0,结果是0个0 print(r1,' ') r2 = re.match(r'^(d+?)(0*))', '102300').groups() #第一组一个0,第二组结尾任意个0;再分组
    print(r2,' ')

    5.正则的编译过程:先把正则编译通过,再去和文本串进行匹配

    故而对于大型复用的正则表达式,可以预编译生成一个RegEx对象,再去匹配任意多的文本串

    编译:

    re_telephone = re.compile(r'^(d{3})-(d{3,8})$') #第一组3个数字开头,中间-分隔,第二组3到8数字结尾

    使用:

    r1 = re_telephone.match('010-12345').groups()
    print(r1,' ')
    r2 = re_telephone.match('010-8086').groups()
    print(r2,' ')

  • 相关阅读:
    学习Python中的集合
    ubuntu14.04下 安装matlabR2015b遇到的一些问题及其解决方法
    matlab的一些关于块分类的函数~~~
    20145207 《Java程序设计》第二周学习总结
    20145207 调查问卷
    20145207 《Java程序设计》第一周学习总结
    10、装饰者模式
    9、观察者模式
    8、迭代器模式
    7、适配器模式
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504594.html
Copyright © 2011-2022 走看看