正则表达式是由普通字符和元字符组成,
普通字符包含大小写字母, 数字. 在匹配普通字符 的时候我们直接写就可以了. 比如"abc" 匹配的就是"abc".
元字符: 元字符才是正则表达式的灵魂. 元字符中的内容太多了, 在这里我们只介绍一些 常用的
主要内容:
- 字符组
- 简单元字符
- 量词
- 惰性匹配和贪婪匹配
- 分组
- 转义
- 字符组:
字符组用[]方括号括起来.在[]中出现的内容会被分配.例如:[zbc]匹配a或b或c
如果字符组中的内容过多换可以使用-,例子:[a-zA-Z0-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: <div>胡辣汤</div> # . 匹配除换行以外的任意字符 reg: <.*> 结果: <div>胡辣汤</div> str: <div>胡辣汤</div> reg: <.*?> 结果: <div> </div>
.*?x的特殊含义 找到下一个x为止
str: abcdefgxhijklmn reg: .*?x 结果:abcdefgx
5. 分组
在正则中使用()进行分组. 比如. 我们要匹配⼀个相对复杂的身份证号. 身份证号分 成两种. 老的身份证号有15位. 新的身份证号有18位. 并且新的身份证号结尾有可能是x
给出以下正则: ^[1-9]d{13,16}[0-9x]$ ^[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'就可以了.