21.Python基础篇-正则表达式与re模块
正则常用
基础符号
.:匹配任意单个字符(除换行符)
^:匹配字符串的开头
$:匹配字符串的结尾
*:匹配前一个字符0次或多次
+:匹配前一个字符1次或多次
?:匹配前一个字符0次或1次
{n}:匹配前一个字符n次
{n, m}:匹配前一个字符n到m次
字符集
[abc]:匹配字符 a、b 或 c
[^abc]:匹配除 a、b、c 以外的字符
[a-z]:匹配小写字母a到z
[0-9]:匹配数字0到9
预定义字符集
\d:匹配任何数字,等同于 [0-9]
\D:匹配任何非数字字符,等同于 [^0-9]
\w:匹配任何字母数字字符(字母、数字、下划线),等同于 [a-zA-Z0-9_]
\W:匹配任何非字母数字字符,等同于 [^a-zA-Z0-9_]
\s:匹配空白字符(包括空格、制表符、换页符等)
\S:匹配非空白字符
分组与选择
(abc):将 abc 作为一个整体进行匹配
|:选择符,例如 a|b 匹配 a 或 b
(ab|cd):匹配 ab 或 cd
(?:...):非捕获组,不存储匹配结果
re模块
re.match()
从字符串的开头开始匹配,只有在字符串的开头找到匹配项时才会返回结果,否则返回 None。
result = re.match(r'a', 'abcdefgabc') # 字符串的开头是a,所以能匹配到 print(result) # <re.Match object; span=(0, 1), match='a'> 返回一个Math对象 print(result.group()) # a 调用group方法打印出匹配的内容 result = re.match(r'a', 'bcdefgabc') # 字符串的开头不是a,即使中间含有a,还是会返回None print(result.group()) # 调用group方法会报错。None.group()会报错
re.search()
在整个字符串中搜索第一个匹配项,只要在字符串中找到一个匹配就会返回结果。匹配不到返回None。
result = re.search(r'b', 'abcdefgabc') # 字符串中的两个b,只返回第一个,而且是前面的b print(result) # <re.Match object; span=(1, 2), match='b'> 返回一个Match对象 print(result.group()) # 调用group方法打印结果:b
re.findall()
返回所有与正则模式匹配的子串,结果以列表形式返回。适合需要查找所有匹配项的情况。匹配不到返回空列表。
result = re.findall(r'\d+', 'abc123xyz456') print(result) # ['123', '456'] result = re.findall(r'\d+', 'xyz') print(result) # []
re.sub()
将字符串中匹配到的部分替换为指定内容。适合在字符串中进行批量替换。
result = re.sub(r'\d+', '*', 'abc123xyz456') # 将多个匹配到的数字组合,替换为*号 print(result) # abc*xyz*
result = re.sub(r'\d+', '*', 'abc123xyz456',count=1) # count=1,表示只替换1次 print(result) # abc*xyz456
re.subn()
subb与sub的区别在于,subn会多返回一个数字,数字表示替换次数。re.split()
根据匹配模式分割字符串,并返回分割后的列表。result = re.split(r'\d+', 'abc123xyz456') print(result) # 输出:['abc', 'xyz', ''] result = re.split(r'\d+', 'abc123xyz456', maxsplit=1) # maxsplit=1表示最多只分割1次 print(result) # ['abc', 'xyz456']