python 正则表达式的使用
re模块的使用
import re
语法:
re.match(pattern, string, flags=0)
pattern | 匹配的正则表达式 |
---|---|
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。re.I 忽略大小写re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境re.M 多行模式re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库re.X 为了增加可读性,忽略空格和 # 后面的注释 |
规则
匹配单个字符
字符 | 功能 | 位置 |
---|---|---|
. | 匹配任意1个字符(除了\n) | |
[ ] | 匹配[ ]中列举的字符 | |
\d | 匹配数字,即0-9 | 可以写在字符集[…]中 |
\D | 匹配⾮数字,即不是数字 | 可以写在字符集[…]中 |
\s | 匹配空⽩,即空格,tab键 | 可以写在字符集[…]中 |
\S | 匹配⾮空⽩字符 | 可以写在字符集[…]中 |
\w | 匹配单词字符,即a-z、A-Z、0-9、_ | 可以写在字符集[…]中 |
\W | 匹配⾮单词字符 | 可以写在字符集[…]中 |
[…]字符集,对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,比如[abc]和[a-c],第一个字符如果是表示取反。所有特殊字符(比如"]“”-“”“)在字符集中都失去原来的含义,如要使用可把”]“”-“放在第一个字符,”^"放在非第一个字符。
匹配多个字符
字符 | 功能 | 位置 | 表达式实例 | 完整匹配的字符串 |
---|---|---|---|---|
* | 匹配前⼀个字符出现0次或者⽆限次,即可有可⽆ | 用在字符或(…)之后 | abc* | abccc |
+ | 匹配前⼀个字符出现1次或者⽆限次,即⾄少有1次 | 用在字符或(…)之后 | abc+ | abccc |
? | 匹配前⼀个字符出现1次或者0次,即要么有1次,要么没有 | 用在字符或(…)之后 | abc? | ab,abc |
{m} | 匹配前⼀个字符出现m次 | 用在字符或(…)之后 | ab{2}c | abbc |
{m,n} | 匹配前⼀个字符出现从m到n次,若省略m,则匹配0到n次,若省略n,则匹配m到无限次 | 用在字符或(…)之后 | ab{1,2}c | abc,abbc |
匹配开头结尾
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
匹配分组
字符 | 功能 |
---|---|
| | 匹配左右任意⼀个表达式 |
(ab) | 将括号中字符作为⼀个分组 |
\num | 引⽤分组num匹配到的字符串 |
(?P) | 分组起别名,匹配到的子串组在外部是通过定义的 name 来获取的 |
(?P=name) | 引⽤别名为name分组匹配到的字符串 |
二、常用函数
re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配,如果没有匹配,就返回一个 None
。
re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配
# re.search函数
import re
str = "阅读次数为9999"
ret = re.search(r"\d", str)
print(ret.group()) # '9'
re.findall函数
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意**:** match 和 search 是匹配一次 findall 匹配所有。
import re
str = "13517923238"
result = re.findall('3', str)
print(result) # ['3', '3', '3']
re.finditer函数
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回
import re
it = re.finditer(r"\d+", "12a32bc43jf3")
for match in it:
print(match.group())
#结果如下:
#9
#12
#32
#43
#3
re.compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
prog = re.compile(pattern)
result = prog.match(string)
# =======等价=================
result = re.match(pattern, string)
re.sub函数
sub是substitute的所写,表示替换,将匹配到的数据进⾏替换。
语法:re.sub(pattern, repl, string, count=0, flags=0)
参数 | 描述 |
---|---|
pattern | 必选,表示正则中的模式字符串 |
repl | 必选,就是replacement,要替换的字符串,也可为一个函数 |
string | 必选,被替换的那个string字符串 |
count | 可选参数,count 是要替换的最大次数,必须是非负整数。如果省略这个参数或设为 0,所有的匹配都会被替换 |
flag | 可选参数,标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 |
import re
ret = re.sub(r"\d+", '998', "python = 997")
print(ret)
re.subn函数
行为与sub()
相同,但是返回一个元组 (字符串, 替换次数)
。
re.subn(pattern, repl, string[, count])
re.split函数
根据匹配进⾏切割字符串,并返回⼀个列表。
re.split
(pattern, string, maxsplit=0, flags=0)
参数 | 描述 |
---|---|
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
maxsplit | 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数 |
三、补充
1.可以通过正则工具箱查询所需要的常用的正则表达式。
2.r的作⽤
与大多数编程语言相同,正则表达式里使用”\”作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。Python里的原生字符串很好地解决了这个问题,Python中字符串前⾯加上 r 表示原⽣字符串。