学习笔记☞ 正则表达式

1、动机

    1、处理文本成为计算机常见工作之一
    2、对文本内容的搜索提取是一项比较复杂困难的工作
    3、为了快速方便处理上述问题,正则表达式技术诞生,逐渐发展为一个被众多语言使用的独立技术

2、定义:

    正则表达式即高级文本匹配模式,提供了搜索,替代等功能。
    本质是由一系列特殊符号和字符组成的字串,这个字串即是正则表达式。
    这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串。

3、目标

    1、熟练使用正则表达式符号
    2、正确组合和理解一般的正则表达式
    3、能够使用Python操作正则表达式

4、正则表达式特点

    1、方便进行检索和修改
    2、支持语言众多
    3、灵活多样
    4、使用场景:
        1、MongoDB正则类型
        2、django等框架作为URL匹配
        3、爬虫

5、正则表达式的使用

    1、Python re模块
        作用:
            处理正则表达式

6、re模块函数:

    1、re.fandall(pattern,string)
        功能:
            使用正则表达式匹配字符串
        参数:
            pattern : 正则表达式
            string : 需要匹配的目标字符串
        返回值:
            一个列表,匹配到的所有内容

7、元字符:

    即正则表达式中有特殊定义的符号

    1、普通字符

        元字符:
            abc
        匹配规则
            匹配相应的普通字符,就代表abc字面值
        示例
            s='abdlabcladgfajdhg'
            re.findall('abc',s)
            ['abc']

    2、或

        元字符:
            ab|cd
        匹配规则
            匹配|两边任意一个正则表达式符合的情况
        示例
            s='abdlabcladgfajdhg'
            re.findall('ab|cd',s)
            ['ab', 'ab']
        注:
            | 两侧不要有没用的空格

    3、匹配一个单一字符

        元字符:
            .
        匹配规则
            匹配处理换行外的任意字符
        示例:
            re.findall('f.o','foo is mot fao')
            ['foo', 'fao']

    4、匹配开始位置

        元字符:
            ^
        匹配规则:
            匹配一个字符串的开始位置
        示例:
            一、
            re.findall('^Hello','Hello world')
            ['Hello']
            二、
            re.findall('^Hello','Hi,Hello')
            []

    5、匹配结束位置

        元字符:
            $
        匹配规则
            匹配目标字符串的结束位置
        示例:
            re.findall('py$','hello.py')
            ['py']        

    6、匹配重复

        元字符:
            *
        匹配规则:
            匹配前面的正则表达式重复0次或多次
        示例:
            re.findall('ab*','a;ladsfbvvjefnbjnabababb')
            ['a', 'a', 'ab', 'ab', 'abb']

    7、匹配重复

        元字符:
            +
        匹配规则:
            匹配前面的正则表达式重复一次或多次
        示例:
            re.findall('ab+','a;ladsfbvvjefnbjnabababb')
            ['ab', 'ab', 'abb']

    8、匹配重复

        元字符:
            ?
        匹配规则
            匹配前面的正则表达式重复0次或一次
        示例:
            re.findall('ab?','abcdefa')
            ['ab', 'a']

    9、匹配重复

        元字符
            {n}
        匹配规则:
            匹配制定的重复次数
        示例:
            re.findall('ab{3}','abbbbbbb')
            ['abbb']

    10、匹配重复

        元字符
            {m,n}
        匹配规则
            匹配前面的正则表达式重复m次 到 n次
        示例:
            re.findall('ab{2,5}','abcdabbbabbbbbbb')
            ['abbb', 'abbbbb']

    11、匹配字符集合

        元字符:
            []
        匹配规则
            匹配中括号中范围内的任意一个字符
        写法:
            [abc123d]   匹配  a b c 1 2 3 d
            [a-z]            a~z中任意一个字符
            [A-Z]            A~Z中任意一个字符
            [0-9]            0~9中任意一个字符
            [123a-zA-Z]      1 2 3 a~z和A~Z中任意一个字符
        示例:
            一、
            re.findall('[abcd]','Hello world')
            ['d']
            二、
            re.findall('[A-Z]','Hello world')
            ['H']
            三、
            re.findall('[0-9]','Hello world 123')
            ['1', '2', '3']
            四、
            re.findall('[_0-9a-zA-Z]','Hello world 123')
            ['H', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '1', '2', '3']

    12、匹配字符集合

        元字符
            [^...]
        匹配规则
            匹配除制定字符集之外的任意字符
        示例:
            re.findall('[^abc]','nihao abc')
            ['n', 'i', 'h', 'o', ' ']

    13、匹配任意数字字符/非数字字符

        元字符
            \d  \D
        匹配规则:
            \d  匹配任意数字字符     等同于     [0-9]
            \D  匹配任意非数字字符   等同于      [^0-9]
        示例:
            \d示例
            re.findall('1\d{10}','15478944564')
            ['15478944564']
            \D示例
            re.findall('\D','hello 123')
            ['h', 'e', 'l', 'l', 'o', ' ']

    14、匹配普通字符/非普通字符 (普通字符:数字字母下划线)

        元字符:
            \w  \W
        匹配规则
            \w  匹配任意一个普通字符      等同于     [_0-9a-zA-Z]
            \W  匹配任意一个非普通字符     等同于     [^_0-9a-zA-Z]
        示例:
            \w示例
            re.findall('\w+','hello_1')
            ['hello_1']
            re.findall('\w+','hello&1')
            ['hello', '1']
            \W示例
            re.findall('\W+','hello&1')
            ['&']

    15、匹配空字符/非空字符(空字符:[ \n\t\r]等)

        元字符
            \s  \S
        匹配规则
            \s  匹配任意空字符
            \S  匹配任意非空字符
        示例:
            \s示例
            re.findall('\s','hello world')
            [' ']
            re.findall('\s','hello world\r\n\t')
            [' ', '\r', '\n', '\t']
            \S示例
            re.findall('\S','hello world')
            ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd']

    16、匹配起止位置

        元字符
            \A  \Z
        匹配规则
            \A  匹配开始位置  等同于^
            \Z  匹配技术位置  等同于$
        绝对匹配:
            \Aabc\Z    只能匹配abc,且字符串只是abc
        示例:
            re.findall('\A/\w+/\w+/Z','/football/zhongchao')
            ['/football/zhongchao']

    17、匹配单词边界位置/非单词边界位置

        元字符
            \b  \B
        匹配规则:
            \b  匹配单词的边界
            \B  匹配非单词的边界
        单词边界:
            数字字母下划线和其他字符的交界位置为单词的边界
        示例:
            re.findall(r'\bis\b','This is a test')
            ['is']
            re.findall('\\bis\\b','This is a test')
            ['is']

            re.findall('\Bis\\b','This is a test')
            ['is']

8、元字符总结:

    1、匹配单个字符: a(普通字符)  . \d \D \w  \W \s \S [...] [^...]
    2、匹配重复性: * + ? {n} {m,n}
    3、匹配某个位置: ^ $ \A \Z \b \B
    4、其他:   |   ()  \

9、转义字符

    正则表达式特殊符号:
        . * + ? ^ $ '' "" [] {} ()
    如果想匹配特殊符号则加转义
    或
    r+字符串:
        r表示原生字符串
    示例:
        re.findall('\\bis','this is')
        ['is']
        或
        re.findall(r'\bis','this is')
        ['is']

10、贪婪和非贪婪

    贪婪模式:
        正则表达式默认的重复匹配模式:贪婪模式
        尽可能多的向后匹配
        在 * + ? {m,n} 这四种情况下会产生贪婪模式
    非贪婪模式(后加?)
        尽可能少的匹配内容,满足正则表达式含义即可
        贪婪转为非贪婪:*? +? ?? {m,n}?
    示例:
        re.findall('ab*?',''abbbbbbbcd)
        [ab]

11、正则表达式分组(子组)

    使用()可以为一个正则表达式建立一个子组,子组可以看做内部的整体

    1、子组的作用
        1、增加子组后多正则表达式的整体匹配内容没有影响
        2、子组可以改变重复元字符的重复行为
        3、子组在某些操作中可以对子组匹配内容单独提取
    2、子组使用的注意事项:
        1、每个正则表达式可以有多个子组,由外到内,由左到右为第一第二……子组
        2、子组通常不要交叉
    3、捕获组和非捕获组(命名组和非命名组)
        子组命名格式
            (?P<name>正则表达式) name就是名字
        命名的优点:
            1、很多编程接口可以直接通过名字获取子组匹配内容
            2、捕获组中的正则表达式可以通过名字重复调用
        重复调用的方法:
            (?P=name)
            示例:
                (?P<dog>ab)cdef(?P=dog) 匹配:abcdefab

                re.search('(ab)+','abababab').group()
                'abababab'

                re.search('(?P<dog>ab)cdef(?P=dog)','abcdefabcde').group()
                'abcdefab'


12、re模块

    1、obj=compile(pattern,flags = 0)

        功能:
            获取正则表达式对象
        参数:
            pattern     正则表达式
            flags       功能标志位,提供更丰富的匹配
        返回值:
            正则表达式对象

    2、re模块和compile对象均有的函数

        1、obj.findall(string, pos, endpos)

            功能:
                通过正则表达式匹配字符串
            参数:
                string  :   目标字符串
                pos     :   目标字符串的匹配开始位置
                endpos  :   目标字符串的结束位置
            返回值:
                匹配到的所有内容以列表返回
            注:
                如果正则表达式有子组则只显示字符匹配内容

        2、obj.split(string)

            功能:
                按照正则表达式切割目标字符串
            参数:
                目标字符串
            返回值:
                切割后的内容,列表形式

        3、obj.sub(replaceString,string,max)

            功能:
                替换正则表达式匹配到的内容
            参数:
                replaceString   要替换的内容
                string          目标字符串
                max             最多替换几处
            返回值:
                返回替换后的字符串

        4、obj.subn(replaceString,string,max)

            功能:
                替换正则表达式匹配到的内容
            参数:
                replaceString   要替换的内容
                string          目标字符串
                max             最多替换几处
            返回值:
                返回替换后的字符串和实际替换的个数,元组格式

        5、re.finditer(string)

            功能:
                使用正则表达式匹配目标内容
            参数:
                目标字符串
            返回值
                迭代对象,迭代的每个内容为一个match对象

        6、re.match(pattern,string)

            功能:
                匹配一个字符串的开头
            参数:
                string  :   目标字符串
            返回值:
                如果匹配到返回 match obj
                没有匹配到返回 None

        7、re.search(pattern,string)

            功能:
                匹配一个字符串
            参数:
                string  :   目标字符串
            返回值:
                如果匹配到返回 match obj
                没有匹配到返回 None
        注:match 只能匹配字符串的开头位置,search可以匹配任意位置,但是也只能匹配一处
           通常match对象调用其属性时往往需要try异常处理

        8、fullmatch()

            要求目标字符串完全匹配

    3、compile对象特有的属性(re模块没有)

        1、flags 标志位
        2、pattern   正则表达式
        3、groupindex    捕获组形成的字典
        4、groups    多少个子组


13、match对象属性方法

    属性:
        pos         目标字符串开头位置
        endpos      目标字符串结束位置
        re          正则表达式对象
        string      目标字符串
        lastgroup   最后一组的名字
        lastindex   最后一组是第几组
    方法:
        end()           匹配到内容的开始位置
        start()         匹配到内容的结束位置
        span()          匹配到内容的起止位置,元组格式
        group()
            功能:
                获取match对象匹配的内容
            参数:
                默认为0,表示获取正则整体的匹配内容
                如果传入大于0的正数,表示获取对应子组匹配内容
            返回值:
                返回匹配的内容
        groups()
            功能:
                得到所有子组匹配的内容,元组格式
        groupdict()
            功能:
                得到所有捕获组匹配的内容,字典格式

14、flags参数:

    compile findall search match finditer fullmacth sub subn split 都有flags参数
    作用:
        辅助正则表达式,丰富匹配结果
    参数选项
        1、A 或 ASCII
            作用:
                匹配ASCII码
        2、S 或 DOTALL
            作用:
                对元字符起作用,可以匹配换行符

        3、I 或 IGNORECASE
            作用:
                匹配大小写
        4、M 或 MULTILINE
            作用:
               对元字符 ^ $ 起作用,可以匹配每一行的开头结尾位置
        5、X 或
            作用:
                为正则添加注释
    多个flags同时使用
        使用 | 分隔
        如 re.I | re.X


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值