从常用实例学习正则1

本章内容

常用正则表达式整理、正则表达式模块整理、Python中re正则模块函数功能整理。

常用正则表达式整理

表达式说明 正则表达式
中文 [\u4e00-\u9fa5]+
QQ号码 [1-9]\d{5,10}
邮箱地址 \w+(?:[-+.]\w+)*@\w+(?:[-.]\w+)*\.\w+(?:[-.]\w+)*
IP地址(泛型匹配) \d+\.\d+\.\d+\.\d+
IP地址(精确匹配) (?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\d*?
手机号 (?:13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}
URL网址 https?://[\w]+(?:[./][\w]+)*
HTML代码中的SRC属性 .*[sS][rR][cC] *= *[\'"](.*?)[\'"].*
HTML代码中的URL网址 .*(?:[sS][rR][cC]|[hH][rR][eE][fF]) *= *[\'"](https?://[\w]+(?:[./][\w]+)*)[\'"].*
身份证15位匹配 [1-9]\d{5}\d{2}(?:0[1-9]|(?:10|11|12))(?:[0-2][1-9]|10|20|30|31)\d{2}[0-9Xx]
身份证18位匹配 [1-9]\d{5}(?:18|19|[23]\d)\d{2}(?:0[1-9]|(?:10|11|12))(?:[0-2][1-9]|10|20|30|31)\d{3}[0-9Xx]

正则表达式模块整理

一般字符

字符 描述
.(英文的点) 匹配任意除换行符\n之外的符号
\ 转义字符,使后一个字符改变原来的意思
[…] 字符集,匹配当中范围内的单个字符(使用 - 代表连续的字符ascii码范围,如a-h代表abcdefgh,常用的有0-9a-zA-Z),
如果第一个字符是^ ,则字符集取反(例如:[^a-z]为所有非小写字母字符),匹配结果为 字符而不是所有的字符组合

非打印字符

字符 描述
\cx 匹配由x指明的控制字符,x的值必须为A-Za-z之一,否则将c视为原义的 'c’字符(例:\cM匹配Control-M或回车符)
\f 相当于\x0c\cL,匹配换页符
\n 相当于\x0a\cJ,匹配换行符
\r 相当于\x0d\cM,匹配回车符
\t 相当于\x09\cI,匹配水平制表符
\v 相当于\x0b\cK,匹配垂直制表符

预定义字符集

字符 描述
\d 相当于[0-9],包括了所有数字字符
\D 相当于[^\d][^0-9],包括了所有非数字字符
\s 相当于[ \t\r\n\f\v],包括了所有空白字符
\S 相当于[^ \t\r\n\f\v],包括了所有非空白字符
\w 相当于[0-9A-Za-z_],包括了所有单词字符(数字、大小写字母、下划线)
\W 相当于[^0-9A-Za-z_],包括了所有非单词字符

数量词

字符 描述
{m} 匹配前一个字符m次
{m,n} m和n最多一个可省略;省略m则{,n}相当于{0,n}匹配前一个字符0-n次;省略n则{m,}匹配前一个字符至少m次,最多无限次
? 相当于{0,1},匹配前一个字符0-1次
* 相当于{0,},匹配前一个字符0-n次
+ 相当于{1,},匹配前一个字符至少1次,最多无限次

边界匹配字符

字符 描述
^ 匹配字符串的开头(多行模式匹配每一行开头,在[^...]中仅表示 的含义)
$ 匹配字符串的末尾(多行模式匹配每一行末尾)
\A 仅匹配字符串开头
\Z 仅匹配字符串结尾
\b 匹配单词边界(字与空格之间的位置)
\B 相当于[^\b],匹配非单词边界

逻辑字符和分组字符

字符 描述
| 相当于or可多个想组,优先尝试左边表达式,如果左边匹配失败,则匹配右边,否则跳过,如果没有 (…),则范围是整个表达式
(…) 分组表示,从左到右遇 ‘(’ 则编号 +1 (第1组编号为1) ,分组作为整体,后面可接数量词,分组内的表达式 | 会被限制在分组内
(?P<name>) 给定分组除了编号以外的额外别名
\<number> 引用编号为 <number> 的分组匹配到的字符串
(?P=name) 引用别名为 name 的分组匹配到的字符串

不作为分组的情况

字符 描述
(?..) 不分组版本,用于使用 **’
(?#…) 此分组用来注释,会被忽略
(?aiLmsux) 此分组设置匹配模式,每个字母代表一个匹配模式,仅在表达式字符串首位表示,详情见下方内容
(?=…) 之后的字符串内容需要匹配表达式才能成功匹配,不消耗字符串内容(例:a(?=\d)代表后面是数字)
(?!..) 之后的字符串内容需要不匹配表达式才能成功匹配,不消耗字符串内容(例:a(?!\d)代表后面不是数字)
(?<=…) 之前的字符串内容需要匹配表达式才能成功匹配,不消耗字符串内容(例:a(?<=\d)代表前面是数字)
(?<!..) 之前的字符串内容需要不匹配表达式才能成功匹配,不消耗字符串内容(例:a(?<!\d)代表前面不是数字)
(?(id/name)
yes-patterm|no-pattern)
如果编号为id或别名为name的组匹配到字符,则需要匹配yes-pattern,否则需要匹配no-pattern(可以省略)

部分数量词的贪婪模式与非贪婪模式

前提:整个表达式匹配成功。
区别:贪婪模式将尽可能的多匹配,非贪婪模式将尽可能的少匹配。

贪婪模式量词 非贪婪模式量词
{m,n} {m,n}?
{m,} {m,}?
? ??
* *?
+ +?

Python中re正则模块函数功能整理

正则匹配模式种类

匹配模式 模式全称 解释 详细解释或备注
re.A re.ASCII 只匹配ASCII字符 Python3的默认字符串已经是UNICODE
re.I re.IGNORECASE 忽略大小写 表达式如[A-Z]也会匹配小写字符
re.L re.LOCALE 语言依赖 只能对byte样式、8位字节有效,且不能和re.ASCII一起使用
re.M re.MULTILINE 多行模式 ^$仅匹配每行开头与每行结尾
re.S re.DOTALL .(英文的点) 匹配全部字符
re.U re.UNICODE Unicode匹配 Python3的默认字符串已经是UNICODE
re.X re.VERBOSE 冗长模式 允许分段和添加注释(每行#后为注释),空白除非字符集或转义,否则忽略

正则对象种类

种类 描述 支持方法 拥有属性
<class 're.Pattern'> 正则表达式对象 searchmatchfullmatchsplitfindallfinditersubsubn flagsgroupsgroupindexpattern
<class 're.Match'> 匹配对象 expandgroup(可以用下标取值)、groupsgroupdictstartendspan posendposlastindexlastgrouprestring
<class 'callable_iterator'> 可迭代对象 None None

统一参数种类

种类 描述
pattern 正则表达式对象
string 待处理字符串
repl 可以是字符串或callback对象,如果是字符串则将正则匹配到的字符串替换成字符串,否则由只接收匹配对象一个参数处理匹配到的字符串
maxsplit 最大分隔次数
count 最大替换次数
flag 正则匹配标记
default 不参与匹配的组合的默认值
__group 匹配结果的组的序号,可以是一个整数或一个整数列表

正则函数功能

  • re.compile(pattern, flags=0)
    • 生成一个正则表达式对象
    • 返回对象:<class 're.Pattern'>
  • re.search(pattern, string, flags=0)
    • 扫描整个字符串找到匹配的第一个位置并返回匹配对象,没有匹配则返回None
    • 返回对象:<class 're.Match'>
  • re.match(pattern, string, flags=0)
    • 从字符串的起始位置匹配(可以不到末尾),在多行模式下只匹配开始位置而不是每行开始,没有匹配则返回None
    • 返回对象:<class 're.Match'>
  • re.fullmatch(pattern, string, flags=0)
    • 整个字符串完整的匹配到正则表达式样式则返回匹配对象,没有匹配则返回None
    • 返回对象:<class 're.Match'>
  • re.split(pattern, string, maxsplit=0, flags=0)
    • 将正则表达式匹配到的所有对象分隔开来,剩下的字符全部返回到列表最后一个元素
    • 返回对象:<class 'list'>
  • re.findall(pattern, string, flags=0)
    • 返回一个不重复的按从左到右顺序返回的匹配列表,如果存在至少一个组,则返回一个组合列表,空匹配不会自动消除
    • 返回对象:<class 'list'>
  • re.finditer(pattern, string, flags=0)
    • 返回一个不重复的按从左到右顺序返回的迭代器对象,里面保存了匹配对象,空匹配不会自动消除
    • 返回对象:<class 'callable_iterator'>
  • re.sub(pattern, repl, string, count=0, flags=0)
    • 使用repl替换字符串最左边正则表达式匹配集合获得的字符串,如果没有匹配结果则不对字符串操作
    • 返回对象:<class 'str'>
    • repl是callback对象时,只接收一个参数且参数类型为<class 're.Match'>
  • re.subn(pattern, repl, string, count=0, flags=0)
    • 行为与 sub() 相同,但是返回一个元组 (字符串, 替换次数)
    • 返回对象:<class 'tuple'>
    • replcallback 对象时,只接收一个参数且参数类型为<class 're.Match'>
  • re.escape(pattern)
    • 转义 pattern 中的特殊字符
    • 返回对象:<class 'str'>
  • re.purge()
    • 清除正则表达式缓存

正则表达式属性解释

属性 描述
flags 正则匹配标记
groups 捕获组合的数量
groupindex 映射由 (?P) 定义的命名符号组合和数字组合的字典
pattern 编译对象的原始样式字符串

匹配对象函数功能

  • re.Match.group(__group)
    • 返回一个或者多个匹配的子组
  • re.Match.groups(default)
    • 返回一个元组,包含所有匹配的子组,在样式中出现的从1到任意多的组合
  • re.Match.groupdict(default)
    • 返回一个字典,包含了所有的有元组别名的子组
  • re.Match.start(__group)
    • 返回组匹配到的字串的开始标号
  • re.Match.end(__group)
    • 返回组匹配到的字串的结束标号
  • re.Match.span(__group)
    • 返回一个匹配区间二元组 (re.Match.start(__group), re.Match.end(__group))

匹配对象属性解释

属性 描述
pos 正则引擎开始在字符串搜索一个匹配的索引位置
endpos 正则引擎停止在字符串搜索一个匹配的索引位置
lastindex 捕获组的最后一个匹配的整数索引值
lastgroup 最后一个匹配的命名组名字
re 返回产生这个实例的正则对象
string 待处理字符串

结束语

这章理论较多,下一章就是练习了~

上一篇:Curiously Recurring Template Pattern


下一篇:阿里Python面试题(部分附带面试标准答案)是你,你了解多少?