• Python全栈开发day6


    1. 简介

           正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。

    2. 常用字符

    普通字符

    abc

    匹配自身

    abc

    abc

    元字符

    .

    匹配除换行符之外的任意字符

    a.c

    abc

     

    转义字符,使后一个字符改变原来的意思

    a.c

    a.c

     

    *

    匹配前一个字符0或多次

    abc*

    ab,abc

     

    +

    匹配前一个字符1或多次

    abc+

    abc,abcc

     

    ?

    匹配其前面的一个字符出现0-1

    abc?

    ab,abc

     

    ^

    匹配字符串开头。在多行模式中匹配每一行的开头

    ^abc

    abc

     

    $

    匹配字符串末尾,在多行模式中匹配每一行的末尾

    abc$

    abc

     

    |

    或关系,匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式

    abc|def

    abcdef

     

    {}

    {m}匹配前一个字符m次,{m,n}匹配前一个字符mn次,若省略n,则匹配m至无限次

    ab{1,2}c

    abc

    abbc

     

    []

    字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc][a-c][^abc]表示取反,即非abc

    所有特殊字符在字符集中都失去其原有的特殊含义。用反斜杠转义恢复特殊字符的特殊含义。

    a[bcd]e

    abe

    ace

    ade

     

         

     

    ()

    被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号“(”,编号+1.

    分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。

    (abc){2}

    a(123|456)c

    abcabc

    a456c

    python中反斜杠作用:

        反斜杠后边跟元字符去除特殊功能;(即将特殊字符转义成普通字符)

        反斜杠后边跟普通字符实现特殊功能;(即预定义字符

        引用序号对应的字组所匹配的字符串

    1
    2
    3
    >>>a=re.search(r'(tina)(fei)haha2','tinafeihahafeitinafeihahatina').group()
    >>> print(a)
    tinafeihahafei

    3. 预定义字符(可以在字符集[]中匹配)

    字符集

    释义

    列举

    Result

    d

    任何十进制数字;[0-9]

    ac

    a1c

    D

    非数字:[^d]

    aDc

    abc

    s

    匹配任何空白字符:[<空格> fv]

    asc

    a c

    S

    非空白字符:[^s]

    aSc

    abc

    w

    匹配包括下划线在内的任何字符:[A-Za-z0-9_]

    awc

    abc

    W

    匹配非字母数字字符: [^a-zA-Z0-9],即匹配特殊字符

    aWc

    a c

    

    匹配wW之间,即匹配单词边界匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'

    abc

    a!bc

    空格abc空格

    a!bc

    B

    [^]

    aBbc

    abc

    A

    仅匹配字符串开头,^

    Aabc

    abc

    z

    仅匹配字符串结尾,$

    abc

    abc

    4. 特殊分组用法

    (?P<name>)

    分组,除了原有的编号外再指定一个额外的别名

    (?P<id>abc){2}

    abcabc

    (?P=name)

    引用别名为<name>的分组匹配到字符串

    (?P<id>d)abc(?P=id)

    1abc1

    5abc5

    <number>

    引用编号为<number>的分组匹配到字符串

    (d)abc1

    1abc1

    5abc5

    5. re模块功能函数

          acompile()

          编译正则表达式模式,返回一个对象的模式。(即把常用的正则表达式编译成正则表达式对象)

        re.compile(pattern,flags=0)

        pattern  编译时用的表达式字符串。

        flags  编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,行匹配等。

    常用的flags有:

    标志

    含义

    re.S(DOTALL)

    使.匹配包括换行在内的所有字符

    re.IIGNORECASE

    使匹配对大小写不敏感

    re.LLOCALE

    做本地化识别(locale-aware)匹配,法语等

    re.M(MULTILINE)

    多行匹配,影响^$

    re.X(VERBOSE)

    该标志通过给予更灵活的格式以便将正则表达式写得更易于理解

    re.U

    根据Unicode字符集解析字符,这个标志影响w,W,,B

          b.match()

           只匹配起始位置(起始位置是否可以匹配成功),匹配单个(匹配成功返回一个对象,未匹配成功返回None)

           match(pattern, string, flags=0)

               pattern 正则模型

               string  要匹配的字符串

               falgs  匹配模式

    1
    2
    3
    4
    5
    print(re.match('com','comwww.runcomoob').group())
    print(re.match('com','Comwww.runcomoob',re.I).group())
    执行结果如下:
    com
    com    

         分组提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)

            r =re.match("h(w+).*(?P<name>d)$", origin)

              print(r.group())     # 获取匹配到的所有结果

              print(r.groups())    # 获取模型中匹配到的分组结果

              print(r.groupdict()) # 获取模型中匹配到的分组中所有执行了key的组

         c.search()

           re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None

           re.search(pattern, string, flags=0)

    1
    2
    3
    print(re.search('dcom','www.4comrunoob.5com').group())
    执行结果如下:
    4com

           *注:matchsearch一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

                   group()返回被 RE 匹配的字符串

                   start() 返回匹配开始的位置

                   end() 返回匹配结束的位置

                   span() 返回一个元组包含匹配 (开始,结束的位置

                   group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。    

        d.findall()

           re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表

           获取非重复的匹配列表;如果有一个组则以列表形式返回,且每一个匹配均是字符串;如果模型中有多个组,则以列表形式返回,且每一个匹配均是元祖;

           空的匹配也会包含在结果中

           注意:re. finditer(pattern, string, flags=0) 迭代一次一次去取数据

        e.re.split()

               split 根据正则匹配分割字符串

               split(pattern, string, maxsplit=0,flags=0)

                  pattern 正则模型

                  string  要匹配的字符串

                  maxsplit:指定分割次数

                  flags  匹配模式

           

            分组后分割

              

         f.re.sub()  替换匹配成功的指定位置字符串

               sub(pattern, repl, string, count=0,flags=0)

                  pattern 正则模型

                  repl    要替换的字符串或可执行对象

                  string 要匹配的字符串

                  count   指定匹配个数

                  flags   匹配模式

           

           re.subn()  返回成功的指定位置字符串以及替换的次数

    6、贪婪匹配与非贪婪匹配

        *,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成非贪婪匹配

  • 相关阅读:
    React开发入门
    API爬虫--Twitter实战
    网页爬虫--scrapy入门
    爬虫入门(实用向)
    随谈10年的技术生涯和技术成长
    html元素的显示和隐藏
    Ubuntu下用cue文件对ape和wav文件自动分轨
    Bash内置命令exec和重定向
    Bash提示符
    Bash启动选项
  • 原文地址:https://www.cnblogs.com/opsedu/p/5604455.html
Copyright © 2020-2023  润新知