正则表达式
内容类
- 正则支持普通字符串, (如: 'a', 'b', 12 )
- 元字符, 通过一个字符匹配一堆内容
\d | (digital)匹配一个数字(0 - 9) |
\w | (word)匹配数字(0-9), 字母(a- zA - Z), 下划线(_) |
\D | 非数字 |
\W | 非字母 |
[]/[^] | [] 范围内匹配, 匹配 [] 内的任意一个字符或 非括号内字符 |
. | 除换行符, 全部匹配 |
计数类
* | 前边的元字符出现任意数量 (有贪婪属性) |
? | 前边的元字符出现或不出现 |
+ | 前边的元字符出现一个或多个 |
{n}, {m, n} | n, m 都为非负正整数 {n} 匹配 n 次 {n,} 最少匹配 n 次 {n,m} 最少匹配 n 次, 最多匹配 m 次 |
边界符号类
^ / $ | |
\b | 匹配边界词 |
\B | 匹配非边界词 |
是否惰性
.* | 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符 |
.*? | 表示"非贪婪"模式,只保存第一个匹配到的子串 |
python re 模块
Python中通过re模块来实现正则功能, 以下是常用示例代码
# 引入Python正则模块
import re
# pattern 字符串形式的正则表达式
# string 要匹配的字符串
# flags 匹配模式
re.findall(pattern="", string="", flags=re.S)
匹配模式:
- 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 为了增加可读性,忽略空格和' # '后面的注释
常用方法示例
import re
# 查找所有匹配项
res1 = re.findall(pattern=r"\d+", string="今天有100, 吃2个包子")
print(res1)
# ['100', '2']
# 搜索匹配项, 返回第一个匹配成功的
res2 = re.search(pattern=r"\d+", string="今天有100, 吃2个包子")
print(res2, ", ", res2.group())
# <re.Match object; span=(3, 6), match='100'> , 100
# 返回匹配的枚举, 数据量大时推荐使用
res3 = re.finditer(pattern=r"\d+", string="今天有100, 吃2个包子")
for r in res3:
print(r, ", ", r.group())
# <re.Match object; span=(3, 6), match='100'> , 100
# <re.Match object; span=(9, 10), match='2'> , 2
# 预编译正则
pattern = re.compile(r"\d+")
print(pattern.match("今天有100, 吃2个包子"))
print(pattern.findall("今天有100, 吃2个包子"))
# 只匹配开头,返回bool
pattern.match(str)
分组匹配
括号分组(通过括号顺序分组)
import re
# 定义正则表达式模式
pattern = r"(\d+)([\w]+)"
# 要匹配的字符串
string = "123hello world"
# 使用 match()方法进行匹配
match = re.match(pattern, string)
# 检查是否匹配成功
if match:
# 通过索引访问分组捕获的内容
group1 = match.group(1)
group2 = match.group(2)
print(f"分组 1: {group1}")
print(f"分组 2: {group2}")
else:
print("匹配失败")
# 分组 1: 123
# 分组 2: hello
命名分组(通过指定分组名字进行分组
(?P<分组名>))
import re
# 定义正则表达式模式
pattern = r"(?P<name>\w+) (?P<age>\d+)"
# 要匹配的字符串
string = "Alice 25"
# 使用 match()方法进行匹配
match = re.match(pattern, string)
# 检查是否匹配成功
if match:
# 通过名称访问分组捕获的内容
name = match.group("name")
age = match.group("age")
print(f"姓名: {name}")
print(f"年龄: {age}")
else:
print("匹配失败")
# 姓名: Alice
# 年龄: 25