正则表达式
正则表达式是对字符串操作的一种逻辑公式.我们一般使用正则表达式对字符串进行匹配和过滤.使用正则的优缺点:
优点:灵活,功能性强,逻辑性强
缺点:上手难,一旦上手,会爱上这个东西.
正则表达式由普通字符和元字符组成.元字符:元字符才是正则表达式的灵魂.元字符中的内容太多了,在这里我们介绍一些常用的.
1.字符组
字符组就是简单的用[]括起来.在[]中出现的内容会被匹配.例如[a:b:c]匹配a或b或c
如果字符组中的内容过多还可以使用-,例如:[a-z]匹配a到z之间的所有字母[0-9]匹配到所有的阿拉伯数字
2.简单元字符
基本的字符.常用的就那么几个
. 匹配出换行符以外的任意字符
w 匹配字母或数字或下划线
s 匹配任意的空白符
d 匹配数字
匹配一个换行符
匹配一个制表符
匹配一个单词的结尾
^ 匹配字符串的开始
$ 匹配字符串的结束
W 匹配到非字母或数字或下划线
D 匹配到非数字
S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所有字符
3.量词
我们目前匹配到的所有内容都是单一文字符号.那么如何一次性匹配到很多个字符呢,我们用到量词
* 重复零次或更多次
+ 重复一次或更多次
? 重复一次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
4.惰性匹配和贪婪匹配
在量词中的*,+,{}都属于贪婪匹配.就是尽可能多的匹配到结果
str: 麻花藤昨天让英雄联盟关服了
reg: 麻花藤.*
此时匹配到的是整句话
在使用.*后面如果加了?则是尽可能的少匹配.表示的是惰性匹配
str: 麻花藤昨天让英雄联盟关服了
reg: 麻花藤.*?
此时匹配的是麻花藤
str:<div>胡辣汤</div>
reg:<.*>
结果: <div>胡辣汤</div>
str:<div>胡辣汤</div>
reg:<.*?>
结果:<div>
</div>
str:<div>胡辣汤</div>
reg:<(div|/div*)?>
结果: <div>
</div>
.*?x的特殊含义 找到下一个为止
str:abcdefgxhijklmn
reg:.*?x
结果:abcdefgx
5.分组
在正则中使用()进行分组.比如.我们要匹配一个相对复杂的身份证号.身份证号分成两种.老的身份证号有15位.新的身份证号有18位.并且新的身份证号结尾有可能是x.
^[1-9]d{14}(d(2)[0-9x])?$
^([1-9]d{16}[0-9x]|[1-9]d{14})$
6.转义
在正则表达式中,有很多有特殊意义的是元字符, 比如
和s等,如果要在正则中匹 配正常的"
"而不是"换行符"就需要对""进行转义, 变成'\'.
在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中也有特殊的含义,本身还需要转义. 所以如果匹配⼀一次"
", 字符串串中要写成'\n', 那么正则里就要写成"\\n",这样就太麻烦了.这个时候我们就⽤用到了r'
'这个概念, 此时的正则是r'\n'就可以了.