正则表达式(或RE)是一种小型的、高度专业化的编程语言,内嵌在Python中,仅做字符的匹配。
1、字符类型:
普通字符和元字符;
1)普通字符:大多数的字符和字母都会和自身匹配,比如:
t2=re.findall('ahh','yahhkkkgggtngslahh') # 匹配结果['ahh', 'ahh']
2)元字符: . ^ $ * + ? {} [] | () /
.匹配除换行符之外的任意字符
^表示匹配字符串的开始,比如^hello'匹配'helloworld'而不匹配'aaaahellobbb
$表示匹配字符串末尾,可参考^
[]用来匹配一个指定的字符集。
| 或的含义。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
重复n次,重复n次或更多次,重复n到m次
\转义字符,后跟元字符,则表示去除特殊功能,\后跟普通字符实现特殊功能,引用序号对应的字组所匹配的字符串,主要有:
\A 只在字符串开始进行匹配
\Z 只在字符串结尾进行匹配
\b 匹配位于开始或结尾的空字符串
\B 匹配不位于开始或结尾的空字符串
\d 相当于[0-9]
\D 相当于[^0-9]
\s 匹配任意空白字符:[\t\n\r\r\v]
\S 匹配任意非空白字符:[^\t\n\r\r\v]
\w 匹配任意数字和字母:[a-zA-Z0-9]
\W 匹配任意非数字和字母:[^a-zA-Z0-9]
案例使用:
案例1:.匹配除换行符之外的任意字符,一个.代表一个字符,多个.代表多个字符
案例2:^必须以字符串开始
案例3:$匹配字符串的结束,必须以字符串结束
案例4:*匹配*前一个字符0次或无限次,比如abc*,可以是ab、abc、abcc、abcccc..等
案例5:+匹配+前一个字符1次或无限次
案例6:?匹配前一个字符0次或1次
案例7:匹配前一个字符m次
案例8:匹配前一个字符m-n次,如果m省略,则指重复0-n次,如果n省略,则指重复m-无限次
案例9:[...]字符集的字符以及转意
字符集可以逐个列出,也可以给出范围如[abc]或[a-c],第一个字符如果是^,则表示取反,如[^abc]表示不是abc的其他字符。所有特殊的字符在字符集中都失去其原有的特殊含义,在字符集中,如果要使用]、-或^,可以在前面加上反斜杠,或把]、-放在第一个字符,把^放在非第一个字符r
其他的转意字符:
\d 匹配任何十进制数:它相当于类[0-9]。
\D 匹配任何非数字字符:它相当于类[^0-9]
\s 匹配任何空白字符:它相当于类[\t\n\r\f\v]
\S 匹配任何非空白字符:它相当于类[^\t\n\r\f\v]
\w匹配任何字母数字字符,它相当于类[a-zA-Z0-9]
\W匹配非任何字母或数字字符,即[^\w]
\b 匹配一个单词边界,也就是指单词和空格间的位置,匹配\w和\W之间,比如一些特殊的字符标点,空格等。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B [^\b]
案例10:\b想要匹配一个单词I,而不是单词中包含的I
2、主要函数:
match(正则模型, 要匹配的字符串, flags=0),从起始位置开始匹配,匹配成功,则返回一个对象,未匹配成功返回None,和search区别是是否从第一个位置开始。需要配合
search(正则模型, 要匹配的字符串, flags=0,浏览整个字符串去匹配,直到找到一个匹配,未匹配成功返回None
findall(正则模型, 要匹配的字符串, flags=0) 浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表。匹配成功的字符串,不在参与下次匹配
split(正则模型, 要匹配的字符串, 指定分隔个数, flags=0) 根据正则匹配分割字符串,返回分割后的一个列表
sub(正则模型, 要替换的字符串, 要匹配的字符串, 指定匹配个数, flags=0),替换匹配成功的指定位置字符串。
subn(正则模型, 要替换的字符串, 要匹配的字符串, 指定匹配个数, flags=0),替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接收。
re.compile(pattern[, flags]):把正则表达式语法转化成正则表达式对象。flags定义包括:
re.I:忽略大小写
re.L:表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M:多行模式
re.S:’ . ’并且包括换行符在内的任意字符(注意:’ . ’不包括换行符)
re.U: 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
group,分组是去已经获取的东西里面再去匹配
group() 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来,有参取匹配到的第几个如2
groups() 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
groupdict() 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
案例11:match和group效果
案例12,groups的效果,一旦表达式有()就是分组
案例13,groupdict的效果
案例14,findall+分组
案例15,split+分组
案例16:替换sub
领取专属 10元无门槛券
私享最新 技术干货