本文目录导读:

我来介绍几个 Python 正则匹配的典型案例:
基础匹配模式
import re
# 示例文本
text = "我的邮箱是 example@163.com,电话是 138-1234-5678"
# 匹配邮箱
email_pattern = r'\w+@\w+\.\w+'
email = re.search(email_pattern, text)
print(f"邮箱: {email.group()}") # example@163.com
# 匹配电话号码
phone_pattern = r'\d{3}-\d{4}-\d{4}'
phone = re.search(phone_pattern, text)
print(f"电话: {phone.group()}") # 138-1234-5678
提取所有匹配内容
import re
# 从文本中提取所有数字
text = "今天是2024年1月15日,温度是25℃,湿度是60%"
numbers = re.findall(r'\d+', text)
print(f"所有数字: {numbers}") # ['2024', '1', '15', '25', '60']
# 提取所有英文单词
text2 = "Hello World! Python is great. 123 ABC def"
words = re.findall(r'[a-zA-Z]+', text2)
print(f"所有英文单词: {words}") # ['Hello', 'World', 'Python', 'is', 'great', 'ABC', 'def']
验证输入格式
import re
def validate_email(email):
"""验证邮箱格式"""
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
return bool(re.match(pattern, email))
def validate_phone(phone):
"""验证手机号格式(11位数字)"""
pattern = r'^1[3-9]\d{9}$'
return bool(re.match(pattern, phone))
def validate_id_card(id_card):
"""验证身份证号(18位)"""
pattern = r'^\d{17}[\dXx]$'
return bool(re.match(pattern, id_card))
# 测试
print(validate_email("user@example.com")) # True
print(validate_email("user@.com")) # False
print(validate_phone("13812345678")) # True
print(validate_phone("12345678901")) # False
替换和分割
import re
# 替换敏感信息
text = "请联系张三:13812345678 或 李四:13987654321"
masked = re.sub(r'\d{11}', lambda m: m.group()[:3] + '****' + m.group()[-4:], text)
print(f"脱敏后: {masked}") # 请联系张三:138****5678 或 李四:139****4321
# 分割字符串
text2 = "Python|Java,JavaScript;C++"
result = re.split(r'[|,;]', text2)
print(f"分割结果: {result}") # ['Python', 'Java', 'JavaScript', 'C++']
复杂文本提取
import re
# 提取HTML中的链接
html = '''
<div>
<a href="https://www.example.com">Example</a>
<a href="http://test.com/page">Test Page</a>
<img src="image.jpg" alt="图片">
</div>
'''
# 提取所有链接
links = re.findall(r'href="(.*?)"', html)
print(f"所有链接: {links}")
# 提取所有标签内容
contents = re.findall(r'>([^<]+)<', html)
print(f"所有文本内容: {[c for c in contents if c.strip()]}")
# 提取URL中的域名
urls = [
"https://www.example.com/page?id=1",
"http://test.com/api/v1",
"ftp://files.site.com/doc.pdf"
]
for url in urls:
domain = re.search(r'//([^/]+)', url)
if domain:
print(f"域名: {domain.group(1)}")
实际应用案例:日志分析
import re
# 模拟日志数据
log_data = """
2024-01-15 10:30:25,123 ERROR [main] com.example.UserService - 用户登录失败: 用户名 admin
2024-01-15 10:30:26,456 INFO [main] com.example.UserService - 用户 admin 登录成功
2024-01-15 10:30:27,789 WARN [main] com.example.UserService - 密码尝试次数过多: 用户 admin
"""
def analyze_log(log):
"""分析日志文件"""
# 提取错误日志
errors = re.findall(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} ERROR.*', log)
print(f"错误日志: {len(errors)} 条")
# 提取所有用户操作
user_actions = re.findall(r'用户 (\w+) (\w+)', log)
print(f"用户操作: {user_actions}")
# 统计日志级别
levels = re.findall(r'(ERROR|INFO|WARN)', log)
from collections import Counter
level_count = Counter(levels)
print(f"日志级别统计: {dict(level_count)}")
analyze_log(log_data)
常用正则表达式速查
import re
patterns = {
# 日期格式
"日期YYYY-MM-DD": r'\d{4}-\d{2}-\d{2}',
"日期YYYY/MM/DD": r'\d{4}/\d{2}/\d{2}',
# 常见格式
"IP地址": r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',
"URL": r'https?://[^\s]+',
"中文": r'[\u4e00-\u9fa5]+',
# 金额
"金额": r'\d+\.?\d*[元$]',
"百分数": r'\d+\.?\d*%',
# 特殊
"车牌号": r'[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤川青藏琼宁]\w{5,6}',
"QQ号": r'[1-9]\d{4,10}',
}
# 测试
test_text = "今天的日期是2024-01-15,IP是192.168.1.1,花费100元,满意度85%"
for name, pattern in patterns.items():
result = re.findall(pattern, test_text)
if result:
print(f"{name}: {result}")
正则匹配的关键点:
- 基本模式:
re.match()从开头匹配,re.search()搜索整个字符串 - 查找所有:
re.findall()返回所有匹配项 - 替换:
re.sub()进行替换操作 - 分组:使用 捕获需要的部分
- 常用元字符:
\d数字,\w字母数字下划线,\s空白字符
需要更具体的案例或解释,请告诉我!