用于文本处理,提取信息。
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的返回值