Python学习之正则表达式
正则表达式
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
字符组
在中括号内编写的多个数据值彼此都是 或 的关系
| 字符组 | 描述 |
|---|---|
| [0-9] | 匹配任何数字。类似于 [0123456789] |
| [a-z] | 匹配任何小写字母 |
| [A-Z] | 匹配任何大写字母 |
| [0-9a-zA-Z] | 匹配任何字母及数字 |
特殊字符
| 字符 | 描述 |
|---|---|
| ^ | 匹配字符串的开头 |
| $ | 匹配字符串的末尾 |
| . | 匹配除 "\n" 之外的任何单个字符 |
| [...] | 匹配字符组中的任意字符 |
| [^...] | 匹配除了字符组中字符的所有字符 |
| \w | 匹配数字字母下划线 |
| \W | 匹配非数字字母下划线 |
| \s | 匹配任意空白字符 |
| \S | 匹配任意非空字符 |
| \d | 匹配一个数字字符。等价于 [0-9]。 |
| \D | 匹配一个非数字字符。等价于 [^0-9] |
| a|b | 匹配字符a或字符b |
| () | 匹配括号内的表达式,也表示一个组。 |
限定符(量词)
| 字符 | 描述 |
|---|---|
| * | 匹配前面的子表达式零次或多次 |
| + | 匹配前面的子表达式一次或多次 |
| ? | 匹配前面的子表达式零次或一次 |
| n 是一个非负整数。匹配确定的 n 次 | |
| n 是一个非负整数。匹配n 次或多次(至少n次) | |
| m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次(n次到m次) |
正则练习
| 正则 | 待匹配字符 | 匹配结果 | 说明 |
|---|---|---|---|
| 海. | 海燕海娇海东 | 海燕 海娇 海东 |
. 匹配除 "\n" 之外的任何单个字符,即匹配所有"海."的字符 |
| ^海. | 海燕海娇海东 | 海燕 | ^ 匹配字符串的开头,即只从开头匹配"海." |
| 海.$ | 海燕海娇海东 | 海东 | $ 匹配字符串的末尾,即只匹配结尾的"海." |
| 李.? | 李杰和李莲英和李二棍子 | 李杰 李莲 李二 |
? 表示重复零次或一次,即只匹配"李"后面一个任意字符 |
| 李.* | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | * 表示重复零次或多次,即匹配"李"后面0或多个任意字符 |
| 李.+ | 李杰和李莲英和李二棍子 | 李杰和李莲英和李二棍子 | + 表示重复一次或多次,即只匹配"李"后面1个或多个任意字符 |
| 李. | 李杰和李莲英和李二棍子 | 李杰和 李莲英 李二棍 |
{1,2} 匹配1次到2次任意字符,即只匹配"李"后面1个或两个任意字符 |
| 李[杰莲英二棍子]* | 李杰和李莲英和李二棍子 | 李杰 李莲英 李二棍子 |
表示匹配"李"字后面[杰莲英二棍子]的任意字符任意次 |
| 李[^和]* | 李杰和李莲英和李二棍子 | 李杰 李莲英 李二棍子 |
[^和] 表示匹配一个不是"和"的字符(*)任意次 |
| [\d] | 456bdha3 | 4 5 6 3 |
\d 表示匹配任意一个数字字符 |
| [\d]+ | 456bdha3 | 456 3 |
+ 表示重复一次或多次,即匹配任意个数字 |
贪婪匹配与非贪婪匹配
贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
非贪婪匹配: *,+,?等都是贪婪匹配,后面加 ? 号使其变成惰性匹配(非贪婪匹配),匹配尽可能短的字符串
| 正则 | 待匹配字符 | 匹配 结果 | 说明 |
|---|---|---|---|
| <.*> | <script>alert(123)<script> | <script>alert(123)<script> | 默认为贪婪匹配模式,会匹配(<开头,>结尾)尽量长的字符串 |
| <.*?> | <script>alert(123)<script> | <script> </script> |
加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配(<开头,>结尾)尽量短的字符串 |
小技巧:在使用贪婪匹配或者非贪婪匹配的时候一般都是用.*或者.*?
并且结束的标志有上述符号左右两边添加的表达式决定
转义符(取消转义)
在正则表达式中,有很多如“\n”、“\t”等的特殊意义元字符,若需要打印一个“\n”而不是换行符,则需要对“\”也进行转义,即在“\”前再加“\”,变成“\\”
\\n >>> \n
\\\n >>> \\n
在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中“\”也有特殊的含义,本身还需要转义。
所以如果匹配一次“\n”,字符串中要写成“\\n”,那么正则里就要写成“\\\\n”,这样就太麻烦了。
这个时候我们就用到了r'\n'这个概念,此时的正则是r'\\n'就可以了。
# python中
r'\n' >>> \n
r'\\n' >>> \\n
| 正则 | 待匹配字符 | 匹配结果 | 说明 |
|---|---|---|---|
| \n | \n | False | 因为在正则表达式中 \ 是有特殊意义的字符,所以要匹配 \n 本身,用表达式 \n 无法匹配 |
| \\n | \n | True | 转义 \ 之后变成 \\,即可匹配 |
| "\\\\n" | '\\n' | True | 如果在python中,字符串中的 '\' 也需要转义,所以每一个字符串 '\' 又需要转义一次 |
| r'\\n' | r'\n' | True | 在字符串之前加r,让整个字符串不转义 |
正则表达式实例
# 编写校验用户手机号的正则
^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$
# 编写校验用户身份证的正则
\d{17}[\d|x]|\d{15}
# 编写校验用户邮箱的正则
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
# 编写校验用户qq号的正则
[1-9][0-9]{4,} # (腾讯QQ号从10000开始)

浙公网安备 33010602011771号