python正则表达式

博客主要整理了几个知识点,提到在Python2和Python3中,正则表达式模块名均为re,还指出有一些比较特殊且使用较少的内容,方便后续查阅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整理下几个知识点, 方便自己后续查阅

模块

python2/python3,正则表达式模块名都是re

先介绍几个基本知识

.匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符)
\转义字符,使后一个字符改变原来的意思,如\s就是代表空白字符
*匹配多次,0-n次
+匹配多次,1-n次,和*的区别,+至少要匹配一次
?匹配0次或1次
^匹配字符串开头,在多行模式中匹配每一行的开头
$匹配字符串末尾,在多行模式中匹配每一行的末尾
|或,如a|b,表示匹配a或b
[...]用来表示一组字符,也能给出一个范围,单独列出,如[abcd]或[a-d],都是匹配'a' 或 'b' 或 'c' 或 'd'
[^...]不在[]中的字符,如[^abc],匹配除了abc之外所有字符
(...)匹配括号里的一个表达式,也表示一个组
{n}/{n,m}里面是一个数字,表示匹配的次数,也可以写一个范围,如{1,3},匹配1到3次
{}?非贪婪模式,只会匹配最小次数,如{1,3}?,表示匹配一次
+?非贪婪模式,如<td>help</td>,<.+>,这样表达式会匹配全部;<.+?>,这样的表达式只会匹配第一个符合条件的<td>
*?非贪婪模式,实例参考 +?
??非贪婪模式,因为?本身是匹配0次或1次,所以??就是匹配0次
\d匹配数字,就是0-9十个数字
\D匹配非数字
\s匹配空白字符,最常用的就是\t\n\r还有space
\S匹配非空白字符
\w匹配字母数字字符,就是0-9十个数字和a-z 26个英文字母
\W匹配非字母数字字符
re.I忽略大小写
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S改变.的匹配模式,使.能匹配包括\n在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
(?<name>)

给匹配到的分组定义一个别名,在使用groupdict()时,会返回一个字典,key就是name,value就是匹配到的值。

如hello world这样的一个字符串,用(?P<test1>\w+)\s(?P<test2>\w+)这个来匹配,
使用groupdict()得到的结果是{'test1': 'hello', 'test2': 'world'}

\number

引用标号为number的分组匹配到的字符串,如<td>1234<td>这样的一个字符串,(<.+?>)\d+\1这样就能匹配到

适用于匹配两头一样的字符串

(?=name)引用别名为name的分组匹配到的字符串,这个用法和 \number 很类似,表达式参考(?P<td>.+?)\d+(?P=td)
(?:...)就是(...)的一个不分组的版本
(?iLmsux)

其中iLmsux每个都代表一个匹配模式,只能用在正则表达式的开头,可同时使用多个;

这种模式,和re.I,re.L,re.M,re.S,re.U,re.X这种方式是等价的

(?#...)#后面的内容将作为注释被忽略
(?=...) 之后的字符串内容需要匹配表达式才能匹配成功,不消耗字符串内容,如a(?=\d),a后面的必须是数字才能匹配成功
(?!...)之后的字符串内容需要不匹配表达式才能匹配成功,不消耗字符串内容
(?<=...)之前的字符串内容需要匹配表达式才能匹配成功,不消耗字符串内容,如a(<=\d),a的前面是数字才能匹配成功
(?<!...)之前的字符串内容需要不匹配表达式才能匹配成功,不消耗字符串内容

还有比较特殊的,用的不多

(?(id/name)yes-pattern|no-pattern) 
如果编号为id或别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern,|no-pattern可省略

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值