zoukankan      html  css  js  c++  java
  • 17 正则表达式、元字符

    正则表达式

    强烈建议!更全面的请查看:https://www.runoob.com/regexp/regexp-syntax.html

    1.re标准库

    re标准库是专门用来出来正则表达式的一个库。

    import re
    

      

    2.findall方法

    a = 'C0C++44fjdsf*%$python##!jacaSCript'
    
    # r = re.findall('正则表达式',字符串) 返回一个列表 正则表达式必须用引号引起来
    r = re.findall('python',a) #从字符串a中找到所有的python
    

      

    3.flags——模式

    在findall、sub等方法都有一个flags参数,它表示模式,默认值为0。

    主要的模式有:

    • re.I 忽略大小写
    • re.S 去除 . 的除换行符 的功能让它能匹配所有字符

    使用多个模式可用|来分割。

    4.正则表达式

    正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。

    元字符使正则表达式具有处理能力。

    所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

    元字符大全:https://www.runoob.com/python/python-reg-expressions.html

    5.re.sub替换方法

    • # 第一个参数:需要查找的正则表达式

    • # 第二个参数:需要替换成的字符串,重要:可以用函数来代替,用函数替换时会给这个函数传入查找到的字符串

    • # 第三个参数:count=0,表示查找并替换的次数

    • # 第四个参数:flags,表示模式

    第二个参数用函数代替:

    s1 = 'abc111abc2222'
    def convert(value):
        matched = value.group()
        return 'zzz'+matched+'!'
    r = re.sub('abc',convert,s1,1)
    结果:
    zzzabc!111abc2222  

    举个例子

    将字符串‘fd1234fds63249fdsgfs732hf’中所有大于等于6的数字改为9,小于6的改为0

    s2 = 'fd1234fds63249fdsgfs732hf'
    def convert(value):
        matched = value.group()
        if int(matched) >= 6:
            return '9'
        else:
            return '0' #注意,返回的是字符而不是数字
    r = re.sub('d',convert,s2)
    print(r)
    结果:
    fd0000fds90009fdsgfs900hf
    

    6.match方法

    re.match方法,从字符串的第一个字符开始匹配,如果第一个字符就不符合则停止匹配。如符合正则表达式也只匹配一个结果。返回值为对象。

    7.search方法

    re.search方法,从字符串的第一个字符开始寻找整个字符串,若找到一个结果,则停止寻找,返回值为对象。

    8.group与groups方法

    从search方法或match方法返回的结果,要提取字符串,就要使用到group方法或groups方法

    group方法的默认参数group1=0,等于0表示啥呢,看下面。

    match或search方法通过正则表达式获取结果,结果默认为一个元组,你可以在正则表达式加一个小括号,结果也相同。

    r1 = re.search('dw', s)
    等价于
    r1 = re.search('(dw)', s)
    

      

    group1=0就表示返回的最完整的这个元组。但如果像下面这样:

    r1 = re.search('d(w)', s)
    

      (w)就是第一个子元组,此时需要单独得到它的内容就需要让group1=1,即r1.group(1)

    同样的,第n个子元组就使用使用group(n),多个子元组可以使用:group(1,2,3,n)

    groups方法,就是group方法的多个子元组形式。即groups()等价于group(1,2,3,..,n)

    findall方法无需使用group方法,如果在正则表达式中使用了(),findall默认返回()中的内容。

    元字符的使用

    1.[xyz] :可以匹配到[ ]中的任意一个字符。

    s = 'abc,acc,adc,aec,afc,ahc'
    # 筛选出第一个字符为a第二个字符为d或f第三个字符为c的结果
    r = re.findall('a[df]c',s)
    print(r)
    # 输出结果为:['adc', 'afc']
    

      

    2.[^xyz]: 匹配所有不包含x/y/z的字符

    s = 'abc,acc,adc,aec,afc,ahc'
    # 筛选出第一个字符为a第二个字符不为d或f第三个字符为c的结果
    r = re.findall('a[^df]c',s)
    print(r)
    # 输出结果为:['abc', 'acc', 'aec', 'ahc']
    

      

    3.概括性的元字符

    我们把一些能代表某个特定字符集合的元字符且称作概括性元字符。

    1. d : 表示[0-9],即0到9的字符集合
    2. D:表示[^0-9],即0-9]之外的字符集合
    3. w:匹配[a-zA-Z0-9_],即所有的字母及数字及下划线的字符集合
      • s = 'abc^%234@#3$%4_'
        r = re.findall('[a-zA-Z0-9_]',s)
        print(r)
        结果为:['a', 'b', 'c', '2', '3', '4', '3', '4', '_']
    4. W:匹配[^a-zA-Z0-9_]
    5. s:匹配空白性字符,即[ f v]
    6. S:匹配所有非空白型字符

    4.数量词——连续匹配

    {n,m}:匹配指定次数

    • 问题:我们知道findall每次只匹配一个字符,若我们要从字符串中提取完整的单词如从‘python34java*&php’中提取python  java Php 三个单词怎么做?
    • 答:使用数量词{n,m}匹配次数:{n}表示匹配n次,{n,m}表示最少连续匹配n次最多连续匹配m次。
    • 如上面的例子可以使用下面方法来进行操作:
    #例1:
    findall('[a-zA-Z]{3,6}',‘python34java*&php’)
    #运行结果:['python', 'java', 'Php']
    例2:
    findall('python{3,6}',‘python34java*&php’)

     * :匹配0次或无限多次

    s3 = 'pytho35pythondkfjpythonnn'
    r = re.findall('python*',s3)
    print(r)
    结果:['pytho', 'python', 'pythonnn']
    

     + :匹配1次或无限多次

    s4 = 'python*&pytho23498fsdpythonnnn'
    r = re.findall('python+',s4)
    print(r)
    结果:['python', 'pythonnnn']
    

    ? :匹配0次或1次

    s5 = 'python%$pytho(*pythonn'
    r = re.findall('python?',s5)
    print(r)
    结果:['python', 'pytho', 'python']
    

    . :一个点,表示匹配除 之外的所有字符。比如需要匹配空格符的同时匹配字母数字等。 

    s9 = 'life is short, I use python'
    r = re.findall('life.*python',s9)
    print(r)
    结果:['life is short, I use python']
    

      

    5.贪婪与非贪婪

    python语言默认是贪婪的。

    贪婪性的表现,当条件为{n,m}时:

    • 贪婪型最多连续匹配m个字符
    • 非贪婪型最多连续匹配n个字符

    非贪婪型的书写:{n,m}?

    拿4中的例子来说,非贪婪型的匹配实例如:

    s2 = ‘python34java*&Php’
    r = re.findall('[a-zA-Z]{3,6}?',s2)
    print(r)
    结果为:['pyt', 'hon', 'jav', 'Php']
    

      

    6.边界匹配符

    ^ : 表示从字符串的第一个字符开始匹配一次,如‘^111’ :表示从字符串的第一个字符开始匹配符合111的字符段一次

    $:表示从字符串的最后一个字符往前匹配一次,如‘111$’ :表示从字符串的最后一个字符往前匹配111,只匹配一次

    :单词边界,如'cha' :表示匹配以cha开始的单词

    B:非单词边界,表示非单词边界匹配

    # 单词边界匹配,不返回匹配值
    s8 = 'I love you'
    r = re.findall('e', s8)
    print(r) #不返回匹配值
    结果:
    []
    

      

    ^ 与 $ 搭配使用:整个字符串是否符合匹配条件,如‘^12345$’:匹配的字符串整个就是‘12345’

    s6 = '111000111'
    r = re.findall('^d{4,8}$',s6) # 对照组
    print(r)
    r = re.findall('^d{4,9}$',s6) # 整个字符串为4-9位的全数字则输出
    print(r)
    结果:
    []
    ['111000111']
    

     

    7.匹配任意字符

    以下都表示任意字符

    • [sS]
    • [wW]
    • [dD]

    8.组的概念

  • 相关阅读:
    93. Restore IP Addresses
    92. Reverse Linked List II
    阿里巴巴 内推 面试
    hulu
    287. Find the Duplicate Number *HARD*
    89. Gray Code
    87. Scramble String *HARD* 动态规划
    84. Largest Rectangle in Histogram *HARD* -- 柱状图求最大面积 85. Maximal Rectangle *HARD* -- 求01矩阵中的最大矩形
    BZOJ2693jzptab
    最大公约数和
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/11754029.html
Copyright © 2011-2022 走看看