正则表达式
1.1定义:
又叫规则表达式,是一种文本模式,针对字符串,实际就是一种语法规则,用来匹配文本中的文本(可以灵活解决寻找到匹配的内容)
1.2语法规则
1.2.1匹配什么字符
- .小数点 :匹配任意的字符(换行符除外)
- \d匹配数字字符
- \D匹配非数字字符
- \w匹配单词字符
- \s匹配空白符(包括换行符、Tab键、空格)
- \S匹配非空白字符
- \ .匹配小数点 需要加反斜杠转义
1.2.2匹配多少次
注意格式 匹配字符 限定符跟在匹配字符后面
1.* 匹配0次或多次
2.+ 出现1次或多次
3.?出现0次或1次(如果出现多次就被拆成1个出现,为了保证出现0或1次)
4.{ n } 出现n次
- {n,m}出现 n-m次 指定范围
6.{n, }出现n次以上
1.2.3在哪里匹配
1.^行首匹配(格式:位置在匹配字符前面)
2.$行尾匹配(格式:位置在匹配字符后面)
3.\b表示匹配单词边界(比如\bword,可以匹配word\words,但不会匹配sword)(格式:位置在匹配字符q前面或后面)
1.2.4匹配指定格式的字符
1.使用()圆括号匹配指定格式的字符
(ab):表示在文本只匹配ab这两个字符,且必须相邻
(a|b):表示在文本中匹配a或者b这两个字符,不一定相邻
注意:圆括号()会把匹配到的内容保存在内存上,开发者可以使用\n来代表一个匹配模式中第n个()中匹配到的内容。
2.使用[]匹配指定类别的字符串,比如:
[abcd]:表示匹配a/b/c/d
[a-d];表示匹配a/b/c/d(或者)
[a-zA-z0-9]:表示匹配所有大小写英文和数字
[^0-9]:表示匹配除了数字之外的所有字符
1.2.5单行模式与多行模式
1.单行模式:小数点.可以匹配任何字符,包括换行符,并且整个文本会被认为是一个完整的文本,使用^和$只能匹配到文本的开头和结尾
import re
text ="""
1344566890
dddddggggh
q2435656qq
"""
# 设置为单行模式
res = re.findall(r'.', text,re.S)
print(res)
# 结果会出现个换行符
#['\n', ' ', ' ', ' ', '1', '3', '4', '4', '5', '6', '6', '8', '9', '0', '\n', ' ', ' ', ' ', 'd', 'd', 'd', 'd', 'd', 'g', 'g', 'g', 'g', 'h', '\n', ' ', ' ', ' ', 'q', '2', '4', '3', '5', '6', '5', '6', 'q', 'q', '\n']
2.多行模式:就不可以匹配换行符,使用^和$可以匹配到每一行的开始和结束
1.2.6贪婪匹配与懒惰匹配
1.贪婪模式:指在正则表达式中的量词会尽可能的多的匹配字符
2.懒惰模式:指在正则表达式中的量词会尽可能少地匹配字符
补(易错):在python的re模块中可以通过在量词后面加一个问号来设置非贪婪(懒惰)模式,不加默认为贪婪模式
1.2.7?问号的几种用法
1.?作为限定符,表示其修饰对象只能出现0或者1次
2.?放在量词前,表示将匹配模式改为懒惰匹配模式
3.完整格式(?=pattern):表示匹配位置后必须要跟着pattern模式的字符,匹配结果并不包括这个模式的字符串
4.(?!=pattern):表示匹配位置后不能跟着pattern模式的字符,匹配结果并不包括这个模式的字符串
5.(?<=pattern):表示匹配位置前面必须跟着pattern模式的字符,匹配结果并不包括这个模式的字符串
6.(?<!pattern):表示匹配位置前面不能跟着pattern模式的字符,匹配结果并不包括这个模式的字符串
7.(?:pattern):表示将pattern包含在一个分组中,但不把这个分组的匹配结果保存到分组编号中。
1.3python中的re库
1.3.1re.match
该函数是从字符串的开始位置进行匹配,如果起始位置没有匹配成功,就返回None,否则返回一个匹配对象,匹配对象的方法
参考附录2
函数原型:re.match(pattern,string,flags=0)
pattern:正则表达式的格式
string:匹配的文本
flags:标志位,用于孔子正则表达式的匹配方式,如是否区分大小写,设置多行匹配模式等,具体标志位参考附录1
使用场景:
1.验证输入格式;如电子邮件,电话号码,日期等
2.提取信息:从字符串的开始位置提前符合正则表达式模式的字串,如提取文件名
3.数据解析;处理日志文件或配置文件时,可以用来解析每行的开始部分,获取关键信息
1.3.2re.search
该函数是从文本中获取第一个符合正则表达式模式的位置,并返回一个匹配对象。如果没有匹配到,就返回None
函数原型:re.search(pattern,string,flags=0)
pattern:正则表达式的格式
string:被匹配的文本
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,设置多行匹配模式,具体的标志位可参考下面的附录1
适应场景:
1.检查字符串是否包含子串
2.提取数据:从字符串中的任意位置提取信息,例如一个文本段落中提取所有提到的日期
3.搜索文件:在某文件中查找特定的消息或事件
1.3.3 re.findall
该函数是从文本中寻找与所有模式匹配的子串,并将所有的匹配结果存储到一个列表进行返回,如果没有匹配成功会返回一个空列表
函数原型:re.findall(pattern,string,flags=0)
pattern :正则表达式的格式
string:被匹配的文本
flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,设置多行匹配模式,具体的标志位可参考下面的附录1
适应场景:
1.提取多个子串:当你需要在字符串中找到所有匹配特定模式的字串时
2.文本分析:在文本中,提取文本中特定的词汇,短语或模式
1.3.4re.sub
该函数的作用就是将文本中与模式匹配的部分替换为其他的内容
函数原型:re.sub(pattern,repl,string,count,flags=0)
pattern:正则表达式的格式
repl:这是替换文本或一个函数,如果是文本,就是将匹配的内容替换为该文本,如果是函数,会在函数中进行文本处理的操作
string:被匹配的文本
count:这是可选参数,表示替换的最大次数,默认值为0,表示替换所有匹配项
flags:标志位,用于控制正则表达式的匹配方式,如,是否区分大小写,设置多行匹配模式,具体的标志位可参考下面的附录1
使用场景有:
1.文本格式化
2.数据清洗:在处理数据是,移除或替换无效或不需要的字符,比如在一系列文本中删除非数字字符以清理电话号码
3.敏感信息脱敏:在显示或存储数据前,将敏感信息(如身份证号码,手机号)的部分内容替换为星号。
1.3.5re.split
该函数的作用就是将某文本根据匹配模式进行分割,并将分割后的结果放入列表中返回
函数原型:re.split(pattern,string,maxsplit,flags=0)
maxsplit:可选参数,表示最大分割次数,默认值为0,表示分割所有匹配项
1.3.6re.compile
该函数会预先编译正则表达式要匹配的模式,并返回一个正则表达式的对象在使用对象去调用这些函数,该对象与re.match返回的对象不同,该对象可以调用上面的函数
函数原型:re.compile(pattern,flags=0)
场景:
多次匹配:当你需要在一个较长文本中多次应用同一个正则表达式时,使用re.complie可以避免每次匹配时都重新编译表达式
附录1标志位
| flags | 说明 |
|---|---|
| re.IGNORECASE或re.l | 使匹配大小写不敏感 |
| re.LOCALE或re.l | 做本地haul识别的匹配,会影响\w,\W、\b、\B |
| re.MULTILINE或re.M | 多行匹配,使^和$能够匹配每一行的行首和行尾 |
| re.DOTALL或re.S | 单行匹配,使特殊字符能够匹配任何字符,包括换行符 |
| re.VERBOSE或re.X | 允许你编写更易于阅读的正则表达式,忽略空白字符和注释 |
| re.ASCII或re.A | 使得\w,\W、\b、\B和大小写字母的匹配只基于ASCII字符集,而不是Unicode |
附录2函数方法
| 方法 | 说明 |
|---|---|
| group() | 返回被匹配的字符串 |
| start() | 返回匹配开始的位置 |
| end() | 返回匹配结束的位置 |
| span() | 返回一个元组包含开始和结束的位置 |
浙公网安备 33010602011771号