正则表达式
简介
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
正则表达式不属于任何一门编程语言,第一门独立的学科,主要用于数据的查找和筛选
本质
使用一些符号的组合产生一些特殊的含义,然后去字符串里筛选出符合条件的数据
正则表达式线上测试网址:http://tool.chinaz.com/regex/
正则表达式之字符组
字符组在没有量词修饰的情况下只会针对一个数据值
| 字符组 | 匹配内容 | 全称 |
|---|---|---|
| [0-9] | 匹配0到9之间任意一个数字(包括0和9) | [0123456789] |
| [A-Z] | 匹配A到Z之间任意一个数字(包括A和Z) | [ABCDEFGHIJKLMNOPQRSTUVWXYZ] |
| [a-z] | 匹配a到z之间任意一个数字(包括a和z) | [abcdefghijklmnopqrstuvwxyz] |
| [0-9a-zA-Z] | 匹配数字、小写字母、大写字母都可以 |
注意:在中括号内编写的多个数据值彼此都是或的关系
正则表达式之特殊符号
特殊符号在没有量词修饰的情况下一个符号一次只会针对一个数据值
| 特殊符号 | 匹配对象 |
|---|---|
| . | 匹配除换行符以外的任意字符 |
| \w | 匹配字母或数字或下划线 |
| \W | 匹配非字母或数字或下划线 |
| \d | 匹配数字 |
| ^ | 匹配字符串开头(^与$组合能够明确的限制想要查找的具体数据) |
| $ | 匹配字符串结尾(^与$组合能够明确的限制想要查找的具体数据) |
| a|b | 匹配字符或字符b(管道符) |
| () | 给正则表达式分组,不影响正则表达式匹配(用于后续的正则起别名 分组获取对应数据) |
| [ ] | 匹配字符组中的字符 |
| [^] | 匹配除了字符组中字符的所有字符 |
正则表达式之量词
| 量词 | |
|---|---|
| * | 重复零次或更多(默认就是尽可能多) |
| + | 重复一次或更多次(默认就是尽可能多) |
| ? | 重复零次或一次(默认就是一次) |
| 重复n次 | |
| 重复n次或更多次 | |
| 重复n到m次 |
贪婪匹配与非贪婪匹配
贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
所有的量词默认都是贪婪匹配,如果在量词的后面紧跟一个问号,就会变成非贪婪匹配
技巧:在使用贪婪匹配或者非贪婪匹配的时候一般都是用.* 或者. * ?,结束的标志有上述符号左右两边添加的表达式决定
| 正则 | 待匹配字符 | 结果 | 说明 |
|---|---|---|---|
| <.*> | < script>... < script> | < script>...< script> | 默认为贪婪匹配模式,会匹配尽量长的字符串 |
| <.*?> | r'\d' | < script>< script> | 加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串 |
转义符
在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对""进行转义,变成'\'。
在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次"\n",字符串中要写成'\n',那么正则里就要写成"\\n",这样就太麻烦了。这个时候我们就用到了r'\n'这个概念,此时的正则是r'\n'就可以了。
| 正则 | 说明 |
|---|---|
| \n | 因为在正则表达式中\是有特殊意义的字符,所以要匹配\n本身,用表达式\n无法匹配 |
| \ \n | 转义\之后变成\,即可匹配 |
| “\ \ \ \n” | 在python中,字符串中的''也需要转义,所以每一个字符串''又需要转义一次 |
| r’\ \n’ | 在字符串之前加r,让整个字符串不转义 |
正则表达式练习题
| 正则 | 待匹配字符 | 结果 | 说明 |
|---|---|---|---|
| 海. | 海燕海娇海东 | 海燕海娇海东 | 匹配所有“海.”的字符 |
| ^海. | 海燕海娇海东 | 海燕 | 只从开头匹配“海.” |
| 海.$ | 海燕海娇海东 | 海东 | 只匹配结尾的“海.$” |
| 李.? | 李杰和李莲英和李二棍子 | 李杰 李莲 李二 |
?表示重复零次或一次,即只匹配"李"后面一个任意字符 |
| 李.* | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | *表示重复零次或多次,即匹配"李"后面0或多个任意字符 |
| 李.+ | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | +表示重复一次或多次,即只匹配"李"后面1个或多个任意字符 |
| 李. | 李杰和李莲英和李二棍子 | 李杰和 李莲英 李二棍 |
{1,2}匹配1到2次任意字符 |
| 李.*? | 李杰和李莲英和李二棍子 | 李 李 李 |
惰性匹配 |
| 李[杰莲英二棍子]* | 李杰和李莲英和李二棍子 | 李杰 李莲英 李二棍子 |
表示匹配"李"字后面[杰莲英二棍子]的字符任意次 |
| 李[ ^ 和 ] * | 李杰和李莲英和李二棍子 | 李杰 李莲英 李二棍子 |
表示匹配一个不是"和"的字符任意次 |
| [\d] | 456bdha3 | 4 5 6 3 |
表示匹配任意一个数字,匹配到4个结果 |
| [\d]+ | 456bdha3 | 456 3 |
表示匹配任意个数字,匹配到2个结果 |
正则表达式实战
常见的正则百度查找即可
# 编写校验用户手机号的正则
0?(13|14|15|17|18|19)[0-9]{9}
# 编写校验用户身份证的正则
\d{17}[\d|x]|\d{15}
# 编写校验用户邮箱的正则
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}
# 编写校验用户qq号的正则
[1-9]([0-9]{5,11})
posted on
浙公网安备 33010602011771号