一、定义
正则表达式是对字符串操作的一种逻辑公式,一般使用正则表达式对字符串进行匹配和过滤。
优点:灵活、功能性强,逻辑性强。
http://tool.chinaz.com/regex/ #在线测试工具
正则表达式由普通字符和元字符组成。普通字符——大小写字母、数字。
二、元字符
1、字符组
字符组用 [ ]括起来,[ ]内容会被匹配。例如[abc] 匹配 a 或 b 或 c 。字符组中的内容过多可以 [a-z] :a~z之间的所有字母 [0-9]; [a-zA-Z0-9]匹配大小写字母数字。
2、简单元字符
元字符 | 匹配内容 |
. | 匹配除换行以外的任意字符 |
w | 匹配字母或数字或下划线 |
s | 匹配任意空白符 |
d | 匹配数字 |
匹配一个换行符 | |
匹配一个制表符 | |
匹配一个单词的结尾 | |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
W | 匹配非字母数字下划线 |
D | 匹配非数字 |
S | 匹配非空白符 |
a | b | 匹配字符a或字符b |
( ) | 匹配括号内的表达式,也表示一个组 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中的字符的所有字符 |
3、量词 —— 一次匹配很多个字符
量词 | 解释 |
* | 重复0次货更多次 |
+ | 重复1 次或更多次 |
? | 重复0次或1次 |
{n} | 重复n次 |
{n, } | 重复n次或更多次 |
{n, m} | 重复n到m次 |
4、贪婪匹配和惰性匹配
在量词中的 * ,+ ,{} 都属于贪婪匹配。就是尽可能多的匹配结果
1 str: 麻花藤昨天让英雄联盟关服了 2 reg: 麻花藤.* 3 此时匹配的是整句话
.* 后面如果加了? 则是尽可能的少匹配,表示惰性匹配
1 str: 麻花藤昨天让英雄联盟关服了 2 reg: 麻花藤.*? 3 此时匹配的是 麻花藤 4 str: <div>胡辣汤</div> 5 reg: <.*> 6 结果: <div>胡辣汤</div> 7 str: <div>胡辣汤</div> 8 reg: <.*?> 9 结果: 10 <div> 11 </div> 12 str: <div>胡辣汤</div> 13 reg: <(div|/div*)?> 14 结果: 15 <div> 16 </div>
.*?x的特殊含义 找到下⼀个x为⽌
1 str: abcdefgxhijklmn 2 reg: .*?x 3 结果:abcdefgx
5、分组 —— 正则中使⽤( )进⾏分组
匹配 老式新式身份证号
1 ^[1-9]d{14}(d{2}[0-9x])?$ 2 ^([1-9]d{16}[0-9x]|[1-9]d{14})$
6、转义
在正则表达式中, 有很多有特殊意义的是元字符, 如
和s等,如果要在正则中匹配正常的"
"而不是"换行符"就需要对""进行转义, 变成'\'.在python中, 无论是正则表达式, 还是待匹配的内容, 都是以字符串的形式出现的, 在字符串中也有特殊的含义, 本身还需要转义. 所以如果匹配一次"
", 字符串中要写成'\n', 那么正则里就要写成"\\n",这样就太麻烦了.这个时候我们就?到了r'
'这个概念, 此时的正则是r'\n'就可以了.