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开始)
posted @ 2022-07-19 19:25  梦想有双休  阅读(93)  评论(0)    收藏  举报