Skip to main content

Python 正则表达式(Regular Expressions)

正则表达式(Regex)是一种强大的字符串匹配和处理工具,Python 提供了 re 模块来处理正则表达式,广泛用于数据清理、文本解析、模式匹配等任务。


1. re 模块

常用函数

函数作用
re.match(pattern, string)从字符串开头匹配
re.search(pattern, string)搜索整个字符串,返回第一个匹配
re.findall(pattern, string)返回所有匹配项的列表
re.finditer(pattern, string)返回所有匹配项的迭代器
re.sub(pattern, replacement, string)替换匹配的内容
re.split(pattern, string)按模式拆分字符串
re.compile(pattern)预编译正则,提高匹配效率

示例

1) re.match() - 从字符串开头匹配

import re

pattern = r"\d+" # 匹配一个或多个数字
result = re.match(pattern, "123abc")
print(result.group()) # 输出: 123

result = re.match(pattern, "abc123")
print(result) # 输出: None (因为匹配必须从字符串开头开始)

2) re.search() - 搜索整个字符串

import re

pattern = r"\d+"
result = re.search(pattern, "abc123xyz456")
print(result.group()) # 输出: 123

re.search() 只返回第一个匹配项,而 re.findall() 返回所有匹配项。


3) re.findall() - 查找所有匹配项

import re

pattern = r"\d+"
result = re.findall(pattern, "abc123xyz456")
print(result) # 输出: ['123', '456']

4) re.finditer() - 迭代查找

import re

pattern = r"\d+"
matches = re.finditer(pattern, "abc123xyz456")

for match in matches:
print(match.group()) # 输出: 123 456

5) re.sub() - 字符串替换

import re

pattern = r"\d+"
replacement = "XXX"
text = "Phone: 123-456-7890"
result = re.sub(pattern, replacement, text)
print(result) # 输出: Phone: XXX-XXX-XXX

6) re.split() - 按模式拆分字符串

import re

pattern = r"\s+" # 匹配空格
text = "Hello world Python Regex"
result = re.split(pattern, text)
print(result) # 输出: ['Hello', 'world', 'Python', 'Regex']

7) re.compile() - 预编译正则表达式

import re

pattern = re.compile(r"\d+")
print(pattern.findall("Order 42, price 100")) # 输出: ['42', '100']

re.compile() 适用于多次使用相同正则表达式的情况,可以提高效率。


2. 常见正则匹配语法

1) 元字符

符号描述示例匹配结果
.任意字符(除换行符)c.tcat, cut
^匹配字符串开头^HelloHello world
$匹配字符串结尾world$Hello world
*匹配0 或更多ab*a, ab, abb
+匹配1 或更多ab+ab, abb
?匹配0 或 1 次ab?a, ab
{n}匹配n 次a{3}aaa
{n,}至少匹配 n 次a{2,}aa, aaa, aaaa
{n,m}至少 n 次,至多 m 次a{2,4}aa, aaa, aaaa

2) 字符集

表达式描述示例匹配
[abc]匹配 abcbb
[^abc]匹配 abcdd
[a-z]匹配小写字母ee
[0-9]匹配数字55

3) 预定义字符

表达式等价于匹配内容
\d[0-9]数字
\D[^0-9]非数字
\s[ \t\n\r\f\v]空白字符
\S[^ \t\n\r\f\v]非空白字符
\w[a-zA-Z0-9_]单词字符(字母、数字、下划线)
\W[^a-zA-Z0-9_]非单词字符

4) 分组和引用

表达式描述示例匹配
(abc)捕获组(ab)+abab
\1反向引用(ab)\1abab
(?:abc)非捕获组(?:ab)+abab

示例:分组匹配

import re

pattern = r"(\d{3})-(\d{3})-(\d{4})"
text = "Phone: 123-456-7890"
match = re.search(pattern, text)

if match:
print(match.group()) # 输出: 123-456-7890
print(match.group(1)) # 输出: 123
print(match.group(2)) # 输出: 456
print(match.group(3)) # 输出: 7890

总结

功能常用方法示例
匹配字符串re.match(), re.search()re.search(r"\d+", "abc123")
查找所有匹配项re.findall()re.findall(r"\d+", "abc123xyz456")
替换字符串re.sub()re.sub(r"\d+", "X", "Phone: 123-456")
拆分字符串re.split()re.split(r"\s+", "Hello world")
预编译re.compile()pattern = re.compile(r"\d+")

Python 的 re 模块提供了强大的正则表达式功能,可以帮助我们高效地处理文本数据。🚀