正则表达式

1.1定义:

又叫规则表达式,是一种文本模式,针对字符串,实际就是一种语法规则,用来匹配文本中的文本(可以灵活解决寻找到匹配的内容)

1.2语法规则

1.2.1匹配什么字符

  1. .小数点 :匹配任意的字符(换行符除外)
  2. \d匹配数字字符
  3. \D匹配非数字字符
  4. \w匹配单词字符
  5. \s匹配空白符(包括换行符、Tab键、空格)
  6. \S匹配非空白字符
  7. \ .匹配小数点 需要加反斜杠转义

1.2.2匹配多少次

注意格式 匹配字符 限定符跟在匹配字符后面

1.* 匹配0次或多次

2.+ 出现1次或多次

3.?出现0次或1次(如果出现多次就被拆成1个出现,为了保证出现0或1次)

4.{ n } 出现n次

  1. {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() 返回一个元组包含开始和结束的位置