正则表达式与re模块
本文参考了很多书籍资料,整合而成,颇为齐全,如有不足,还请指出,谢谢。
目录
一、正则表达式简介
1.1 正则表达式的内容与用处
在处理字符串时,经常会有查找某些复杂规则的字符串需求。正则表达式就是用于描述这类规则的工具。
正则表达式是字符串的某些复杂规则,是记录文本规则的代码。
简而言之,正则表达式就是用来找东西的,就是用来找你所需要的字符串的工具。
如果你仍然一头雾水,请接着往下看,慢慢你就懂了。
二、正则表达式基础
P.S. 本部分仅仅是介绍正则表达式,如果要应用至Python,还需加引号等,详情见下文。
2.1 行定位符
行定位符就是用来描述子串 (串中任意个连续的字符组成的子序列称为该串的子串) 的边界。
顺便说明一下字符串、子串和子序列的区别:
字符串:Anonymous
字串是在字符串中,取出一块(连续的),如:Ano,onym,ou,等
子序列指的是从字符串中,顺序取出字符,但是可以不连续:如:Ays,Anon,ys等
行定位符只有两个
^ 表示行的开始
$ 表示行的结尾
举个例子
^tm
可以与 ‘tm Knight’ 或 ‘tm knight’ 等以tm开头的子串匹配。
但是 ‘atm’ 或 ‘Knight tm’ 则不会被匹配
$tm
则与 ‘Knight tm’ 等以tm结尾的子串匹配,而 ‘tm aaa’ 则不会被匹配。
如果希望要匹配的子串可以出现在字符串的任意部分,那么可以直接写成
tm
这样就可以与 ‘tm Knight’ 或 ‘tm knight’ 或 ‘Knight tm’ 等子串匹配了。
2.2 元字符
元字符较多,话不多说,先上表格。
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母、数字、下划线或汉字 |
\W | 匹配除字母、数字、下划线或汉字以外的字符 |
\s | 匹配单个的空白符(包括Tab键和换行符) |
\S | 匹配除单个的空白符(包括Tab键和换行符)以外的所有字符 |
\d | 匹配单个数字 |
\D | 匹配单个非数字字符 |
\b | 匹配单词的开始或结束,单词的分界符通常是空格、标点符号或者换行 |
^ | 匹配行的开始 |
$ | 匹配行的结束 |
\A | 仅匹配字符串的开头 |
\Z | 及匹配字符串的结尾 |
其中,^与$既是行定位符,又是元字符。
注意:^与\A,$与\Z,不完全一样,后续讲到re模块时会详细说明。
由于元字符数量较多,暂时不一一举例,后面的代码示例中会包含元字符。
2.3 限定符
如果你想要匹配特定数量的字符,就需要限定符的帮助。
上表!
限定符 | 说明 | 举例 | 可匹配的字符串 |
---|---|---|---|
? | 匹配前面的字符零次或一次 | colou?r | colour或color |
+ | 匹配前面的字符一次或多次 | go+gle | 从gogle到goo…ogle |
* | 匹配前面的字符零次、一次或多次 | go*gle | 从ggle到goo…ogle |
{n} | 匹配前面的字符n次 | go{2}gle | |
{n,} | 匹配前面的字符最少n次 | go{2,}gle | 从google到goo…ogle |
{n,m} | 匹配前面的字符最少n次,最多m次 | employe{0,2} | employ或employe或employee |
温馨提示:注意限定符限定的是前一个字符的次数。
2.4 字符类
正则表达式查找数字和字母是很简单的,因为已经有了对应这些字符集合的元字符(如, \d , \w 等),但是如果要匹配没有预定义的字符集合,就需要用到法宝——" [ ] " (方括号)
如想匹配a,e,i,o,u,就直接输入
[aeiou] #不要加逗号!!!
再比如
[.?!] #匹配“.”,“?”,“!”
[0-9] #相当于\d,匹配单个数字
[a-zA-Z] #匹配单个英文字符
2.5 排除字符
如果想表示不匹配某个子串的意思,我们就要用到正则表达式里的排除字符——^(没错,仍然是这个符号)
但是我们的语法结构不同了——
[^a-zA-Z]
#使用时放在方括号里,表示匹配时排除方括号内所有字符
#在本例中,该表达式会匹配一个不是字母的字符
2.6 选择字符
如果在表达式中想匹配有多重可能性的字符,就可以用到选择字符——“|”
语法格式为,放于两个子串之间,表示匹配a子串或b子串。
稍后会与2.7一起有小练手讲解,详见下文。
2.7 小括号
在正则表达式中,如果想改变限定符(如 “|” “^” “*” 等)的作用范围或对某些字符组成的子串进行分组,就需要用到小括号。
举个例子
(six|four)th #匹配sixth或fourth
six|fourth #匹配six或fourth
(\d{
0,3}[a-z]){
3} #是对括号内部分进行重复操作
#结果等同于\d{0,3}[a-z]\d{0,3}[a-z]\d{0,3}[a-z]
\d{
0,3}[a-z]{
3}
#结果等同于\d{0,3}[a-z][a-z][a-z]
小练手
要匹配身份证号(18位)的表达式(不区分大小写):
先自己试试吧!(答案在2.9后)
2.8 转义字符
正则表达式的转义字符,与python中的大同小异,都是将特殊字符变为普通字符,所以这里不过多赘述了。
举个例子
要匹配IP