Bootstrap

正则表达式

用于文本处理,提取信息。                                                                                                                
https://www.w3cschool.cn/regexp/6a7w1pr0.html
https://www.w3cschool.cn/regexp/cwp91pqg.html
https://www.bilibili.com/video/BV1q4411y7Zh

正则表达式验证网站:
    http://regex101.com

宏观思路

单行多行模式

单行匹配模式中一些字符表达的含义就不一样了

例如^$表示开头和结尾,.不可以匹配换行符,此时想要匹配所有字符可以使用[\S\s]或者[\d\D]之类的补集形成全集

多行模式中^$只能匹配到行的开头和结尾,.也能匹配换行符了(注意某些引擎需要开启DOTALL)

匹配项和捕获组

匹配项就是我们写的正则表达式匹配到的整个字符串

例如, a12345645kkkl2301 通过 [a-z](\d{3}) 的匹配项是 a123 和 k123 我们此时可以通过捕获组对匹配项进行更细致的提取1号捕获组就是123

领宽度语法

当我们后面的匹配项的标志字符被前面的字符串匹配了会怎么样?

后面的匹配项就丢失了结构字符串,没法被匹配

例如:

a123b123c123d

我们想匹配所有被字母包夹的数字

这样写 [a-z].+?[a-z]

第一个匹配项没问题 a123b

但是现在第一个匹配项匹配之后目标字符串实际上待匹配的字符是123c123d

发现丢失了b123c

可能会想到将b还回去,通过非捕获组?

实际上影响是否将字符还回去的操作不是捕获组,因为捕获组是在匹配项再进行的操作,所以不会改变匹配项

我们有种语法叫做零宽度,就是将匹配到的字符串还回去,不占用后续匹配项的字符

 语法:
    分为
        普通字符,用于匹配字符,表示‘此处为~并且后面’
        元字符(metacharacters),表示一些特殊含义
            .*+?\[]^${}|()
            .表示匹配除了换行符号以外的所有字符(意思就是换行符不配),.表示‘不是换行’
python如何使用正则表达式:
    import re 
    re.complie(r'.色')
    for one in p.findall(content)
        print(one)
        r的意思是不识别转义字符\ 
        compile返回一个对象,可以调用compile类的各种处理函数(编译compile)
        findall最为常用
        
            *号表示匹配前面的子表达式任意次数,包括0次
                例如:,.* 表示匹配与前面的字符匹配,后面直到换行符之间的字符和逗号全部匹配,*表示‘匹配直到匹配冲突’,的意思
                绿色* 这样的正则 我们可以这样看 绿 (色*) 匹配绿 而 色* 可有可无
            +号,表示匹配前面的字符,超过1次包括1次。与*号相比就是一定要匹配。+表示‘匹配直到匹配不到’的意思
                例如 绿色+ 这样的正则 我们可以这样看 绿色 + 表示为绿色匹配,+单独为延续 色可有可无
            {}花括号,表示匹配指定次数,结合前一个字符。{3,9}这样表示3~9包括3,9. {}的意思是‘匹配次数’
                例如 绿色{3,9} 可以看做,绿色3 (9-3)色 可有可无但不可冲突
        注意:贪婪,*和+会匹配很多的字符,例如想要匹配<.*>想匹配尖括号和里面所有内容,但是反尖括号会被.*优先匹配,导致最后的>匹配不到
            ?添加在*和+后面会与其结合,表示尽可能少的匹配,优先匹配后面的普通字符,再来匹配这个
            \ 反斜杠字符,加上\会与其后的字符结合,表示转化为普通字符,进行匹配
                \ 还会与特定的字母结合表示一些特殊的含义
                    \d 0~9
                    \D    不是0~9
                    \s    空白字符 空格 tab 换行等
                    \S    非空白字符
                    \w    文本字符 如a-z A-z 0~9 word
                    \W    配文本字符
            不同的模式,这些\w表示不同,在ascall模式中只有字母才是\w
            []方括号的意义,就是枚举。方括号里的字符都可以匹配
            [3-6] 可以看做 3
                           4 在[]中-表示从哪里到哪里
                           . 在[]里面就失去了特殊含义,仅表示普通字符,因为[]表示枚举,那么你的.就无效了
                           ^ 和后面的一串字符全部结合,符号在[]里面表示非的意思,例如^\d表示不是数字,
            ^ 表示匹配文档开头,在多行模式就是每一行的开头,在单行模式表示文档开头.
            $ 表示文本的结尾匹配结尾 ,在单行模式,多行模式不同
            () 组选择 ,表示括号里的是一组,选取匹配结果中的某个部分.可以理解为用正则表达式匹配了两次
                不同的组如何获得?返回元祖自己选择
            ? 与前一个字符结合,表福匹配0或者一次,就是可有可无的意思 这样不会产生匹配冲突
            用正则表达式切割字符串
                names = '关羽;张飞,赵云 马超 '
                re.split(r'[;,\s]\s*',names)
            替换函数
                用re.sub(正则表达式,处理函数,字符串匹配池)
                 每匹配到一次会会调用处理函数,将处理函数返回值作为re.sub的返回值
                              

;