当前位置 博文首页 > RemainderTime:另一个世界系列:Python之正则表达式和JSON(五)

    RemainderTime:另一个世界系列:Python之正则表达式和JSON(五)

    作者:[db:作者] 时间:2021-07-12 21:47

    今天我们来学习Python的正则表达式,我想接触过其他语言的朋友一定不陌生,正则表达式并不是python特有的,其他语言也有正则表达式。

    正则表达式的官方介绍为:正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

    学习点

    在python中使用正则表达式,需要在文件头部引入正则表达式的内置对象才能使用

    import re
    

    常用的方法为

    re.findAll()
    

    例1 匹配数字

    import re
    
    a='hdhfdh55df5df49d+'
    r=re.findall('\d',a)   
    print(r)
    

    输出:[‘5’, ‘5’, ‘5’, ‘4’, ‘9’]

    解释:

    方法中的第一个参数 /d 表示只匹配字符串中的数字,第二个参数 a 表示需要操作的字符串变量

    想了解更多的正则表达式方法可自行进行百度学习,这里只进行部分常见的规则进制学习。

    例2 字符集

    #字符集
    import re
    
    a='abc,abd,acc,abd,asd'
    r=re.findall('a[cb]d',a)
    s=re.findall('a[^cb]d',a)
    print(r)
    print(s)
    

    输出1:[‘abd’, ‘abd’]
    输出2:[‘asd’]

    解释:

    方法中第一个参数使用了 [cd ] 这个符号,表示只要子子串中出现了其中一个都会匹配上,反之如果是这样 [^cd ] 符号中加了 ^ 符号则表示子串中只要包含了其中一个字符都不会被匹配上

    例3 概括字符集

    #概括字符集
    import re
    
    #\d  数字 \D  非
    #\w   单词字符   \W  非
    # \s 空白字符   \S 非
    a='5566dfd5fdg5gs26s0'
    
    r=re.findall('[1-9]',a)
    s=re.findall('[^0-9]',a)
    f=re.findall('\w',a)
    print(r)
    print(s)
    print(f)
    

    输出:

    [‘5’, ‘5’, ‘6’, ‘6’, ‘5’, ‘5’, ‘2’, ‘6’]
    [‘d’, ‘f’, ‘d’, ‘f’, ‘d’, ‘g’, ‘g’, ‘s’, ‘s’]
    [‘5’, ‘5’, ‘6’, ‘6’, ‘d’, ‘f’, ‘d’, ‘5’, ‘f’, ‘d’, ‘g’, ‘5’, ‘g’, ‘s’, ‘2’, ‘6’,
    ‘s’, ‘0’]

    解释:

    [1-9] 表示只匹配数字
    [^0-9] 表示匹配除去数字外的字符
    \w 表示匹配打个词的字符

    例4:数量词

    #数量词
    import re
    
    a='5566dfd5fdg5gs26s0'
    r=re.findall('[a-z]{2,6}',a)
    s=re.findall('[a-z]{2,6}?',a)
    #贪婪  与 非贪婪
    #python 默认贪婪
    #非贪婪 后面加问号
    print(r)
    print(s)
    

    输出:

    [‘dfd’, ‘fdg’, ‘gs’]
    [‘df’, ‘fd’, ‘gs’]

    解释:

    [a-z]{2,6} 表示只匹配连续的2到6个英文字符的子串,匹配尽可能多的连续字符 (贪婪的
    [a-z]{2,6}? 表示只匹配连续的2到6个英文字符的子串,但它是非贪婪的,所以它匹配的总是匹配最少额连续字符,总是匹配连续的2个字符 (非贪婪的

    • Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试匹配尽可能少的字符
    #数量词
    #*  匹配0次或者无限次
    #? 匹配0次或者1次
    #+  匹配1次或者无限次
    import re
    
    a='pytho5python4pythonn2'
    
    r=re.findall('python?',a)
    r2=re.findall('python*',a)
    r3=re.findall('python+',a)
    
    print(r)
    print(r2)
    print(r3)
    

    输出:

    [‘pytho’, ‘python’, ‘python’]
    [‘pytho’, ‘python’, ‘pythonn’]
    [‘python’, ‘pythonn’]

    例5 边界匹配

    #边界匹配
    import re
    qq='100001'
    #4~8
    r=re.findall('01$',qq)
    print(r)
    

    输出:

    [‘01’]

    解释:

    01$ 表示只要字符串最后为 01 则输出01

    例6 组

    #组  ()
    import re
    
    a='pythonpythonpython222'
    r = re.findall('(python){3}',a)
    
    print(r)
    

    输出:

    [‘python’]

    解释:

    (python){3} 表示只要字符串有连续3组 python 字符串 则输出 python

    例7 第三个参数

    #第三个参数
    import re
    
    a='PythonC#Java'
    #.号匹配任何字符包括换行符 \n
    
    r=re.findall('C#.{1}',a,re.I)
    
    # re.I 表示忽略大小写   re.S 表示改变.号的行为
    # r=re.findall('C#.{1}',a,re.I | re.S)
    print(r)
    

    输出:

    [‘C#J’]

    解释:

    C#.{1} 着重使用 点 字符 匹配后面任何一个字符
    re.I 第三个参数就是结合 点号使用的

    例8 替换

    #替换  
    import re
    a='PythonC#Java'
    # 1表示只替换第一个 
    r = re.sub('C#','GO',a,1)
    
    #内置函数替换
    b = a.replace("C#","GO")
    
    print(b)
    print(r)
    

    输出:

    PythonGOJava
    PythonGOJava

    解释:

    re.sub(‘C#’,‘GO’,a,1) 使用字符串 GO 替换 字符串 C# 并且只替换 a 字符串中第一个出现的 C# 子串

    例9 使用函数替换操作

    # 使用函数替换操作
    import re
    a ='Abc5566555'
    
    #函数
    def show(value):
        #打印出来的是一个对象
        #print(value)
        #获取集体的值
        matched = value.group()
        if int(matched) >= 6:
            return '9'
        else:
            return "7"
    
    r = re.sub('65',show,a)
    
    print(r)
    

    输出:

    Abc556955

    解释:

    这个逻辑比较难理解,就是字符串需要替换 65 但65又作为参数传入 show()函数中,通过一系列的操作,获取到 int 类型的65 再与 6 比较 若 65 大于等于 6 则字符串 a 中的65替换为9 反之替换为 7

    例10 其他函数匹配

    import re
    #其他函数匹配
    s = 'C55ff55566'
    r = re.match('\d',s)
    print(r)
    #获取匹配的位置
    print(r.span())
    r2 = re.search('\d',s)
    print(r2)
    #获取值
    print(r2.group())
    

    (不知为何,本地未成功输出)

    注:与 findAll() 不同之处为他们都只匹配一次

    例11 较复杂组() 匹配

    import re
    
    s = 'int sdf= dfd d, python , i love java'
    
    #使用组匹配  ()  ,可以多个组
    r = re.findall('int(.*)python(.*)java',s)
    
    print(r.group(1,2))
    #获取全部组
    print(r.groups())
    

    (不知为何,本地未成功输出)

    • 一共刚好 11 个例子 ,今天刚好 11.11
    cs