本文讲解一下Python的正则表达式,主要介绍正则表达式的概念、在Python中如何使用正则表达式,常用的正则表达式处理函数,最后分享几个简单的使用示例。
一、正则表达式
1、概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个”规则字符串”,这个”规则字符串”用来表达对字符串的一种过滤逻辑。
2、用途
- 匹配和查找文本:使用正则表达式可以快速匹配和查找特定模式的文本,例如查找包含特定单词的句子、匹配邮箱、电话等;
- 数据清洗和处理:去除特定字符或标签、提取文本中的有效信息等;
- 表单验证:正则表达式可以用于验证用户输入的表单数据,验证邮箱地址是否合法等;
- 字符串替换:将文本中的某个模式替换为另一个字符串;
- 提取信息:提取特定的信息,例如提取网页中的链接,日志中的关键信息。
3、在线测试工具
链接:正则表达式
二、Python正则表达式
Python内置了re模块,封装了一些函数用来处理正则表达式。 简单示例:
import re |
三、re模块常用函数
1、re.match
尝试从字符串的起始位置匹配一个模式,如果不是起始位置,match返回None。re.match(pattern, string, flags=0)
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,比如:是否区分大小写,多行匹配等 |
- re.I 使匹配对大小写不敏感
- re.L 做本地化识别匹配
- re.M 多行匹配
- re.S 使.匹配包括换行在内的所有字符
- re.U 根据Unicode字符集解析字符
- re.X 为了增加可读性,忽略空格和#后面的注释
2、re.search
扫描整个字符串并返回第一个成功的匹配。search
vs match
:match
要从字符串的起始位置匹配。
import re |
3、re.sub
用于替换字符串中的匹配项。re.sub(pattern, repl, string, count, flags)
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
repl | 替换的字符串,也可以是一个函数 |
string | 要匹配的字符串 |
count | 模式陪陪后替换的最大次数,默认替换所有 |
flags | 标志位,用于控制正则表达式的匹配方式,比如:是否区分大小写,多行匹配等 |
简单替换:
import re |
函数模式替换:
import re |
4、re.compile
compile函数用于编译正则表达式,生成一个正则表达式Pattern对象,供match和search使用。re.compile(pattern[, flags])
import re |
5、re.findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表。findall(pattern, string, flags=0)
import re |
如果匹配不到返回空列表。
6、re.finditer
在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。re.finditer(pattern, string, flags=0)
import re |
12
32
43
3
7、re.split
按照能够匹配的子串将字符串分割后返回列表。re.split(pattern, string[, maxsplit=0, flags=0])
- maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
import re |
import re |
对于一个找不到匹配的字符串而言,split 不会对其作出分割。
8、分组
正则表达式中,group()用来提出分组截获的字符串,()用来分组
import re |
正则表达式中的三组括号把匹配结果分成三组 group() 同group(0)就是匹配正则表达式整体结果
group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。
9、贪婪模式与非贪婪模式
import re |
四、正则表达式模式
参数 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,’m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{n} | 精确匹配n个前面表达式。例如,o{2}不能匹配”Bob”中的”o”,但是能匹配”food”中的两个o。 |
re{n,} | 匹配n个前面表达式。例如,o{2,}不能匹配”Bob”中的”o”,但能匹配 |
re{n,m} | 匹配n到m次由前面的正则表达式定义的片段,贪婪方式 |
a|b |
匹配a或b |
(re) | 对正则表达式分组并记住匹配的文本 |
(?imx) | 正则表达式包含三种可选标志:i,m,或x。只影响括号中的区域。 |
(?-imx) | 正则表达式关闭 i,m,或x可选标志。只影响括号中的区域。 |
(?:re) | 类似 (…),但是不表示一个组 |
(?imx:re) | 在括号中使用i,m,或x可选标志 |
(?-imx:re) | 在括号中不使用i,m,或x可选标志 |
(?#…) | 注释. |
(?=re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?!re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
(?>re) | 匹配的独立模式,省去回溯。 |
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\s | 匹配任意空白字符,等价于 []。 |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,’e’可以匹配”never”中的’er’,但不能匹配”verb”中的 ‘er’。 |
\B | 匹配非单词边界。’er\B’ 能匹配”verb”中的 ‘er’,但不能匹配”never”中的’er’。 |
\n,\t,等. | 匹配一个换行符。匹配一个制表符。 |
\1…\9 | 匹配第n个分组的内容。 |
\10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。 |
五、常用示例
1、匹配”Python”或”python”
[Pp]ython
2、匹配括号内的任意字母
[aeiou]
3、匹配任意字母或数字
[a-zA-Z0-9]
4、匹配除了数字外的字符
[^0-9]
或\D
5、匹配邮箱
[\w\.-]+@\.\w+
6、findall多个匹配模式,返回元组列表
import re |
7、返回字典对象
import re |
{‘province’: ‘132’, ‘city’: ‘929’, ‘birthday’: ‘19970327’}