本文目录导读:

- 验证邮箱格式
- 提取网页链接中的域名
- 手机号脱敏(隐藏中间四位)
- 分割字符串并保留分隔符
- 查找所有十六进制颜色值
- 检测密码强度(至少包含数字、大写、小写、特殊字符)
- 替换字符串中的空格(包括全角、半角、连续多个)为单个空格
- 总结表
正则表达式(regex)在Python中主要通过re模块实现,以下列举几个经典且实用的案例,覆盖了提取、验证、替换和分割等常见场景。
验证邮箱格式
目标:检查一个字符串是否符合常见的邮箱格式。
import re
def is_valid_email(email):
# 常见邮箱正则:允许字母、数字、点、下划线、中划线,@后为域名
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return re.match(pattern, email) is not None
# 测试
emails = ['user@example.com', 'invalid-email', 'user@.com', 'user@sub.domain.com']
for e in emails:
print(f"{e}: {is_valid_email(e)}")
# 输出:
# user@example.com: True
# invalid-email: False
# user@.com: False
# user@sub.domain.com: True
提取网页链接中的域名
目标:从一段HTML或文本中提取所有的http/https链接,并获取其中的域名部分。
import re text = "访问 https://www.example.com/path 或 http://sub.domain.org/hello" # 匹配URL(简化版) url_pattern = r'https?://([a-zA-Z0-9.-]+)' matches = re.findall(url_pattern, text) print(matches) # 输出:['www.example.com', 'sub.domain.org']
手机号脱敏(隐藏中间四位)
目标:将字符串中的手机号(中国大陆11位)中间四位替换为。
import re
text = "我的手机是13812345678,联系他:13900001111"
# 分组捕获前三位和后四位,中间替换
masked = re.sub(r'1[3-9]\d{9}', lambda m: m.group()[:3] + '****' + m.group()[-4:], text)
print(masked) # 输出:我的手机是138****5678,联系他:139****1111
分割字符串并保留分隔符
目标:按标点符号分割句子,但保留分隔符在结果中。
import re text = "你好,世界!Python很棒。" # 使用括号捕获分隔符,split会保留捕获组 parts = re.split(r'([,!。])', text) print(parts) # 输出:['你好', ',', '世界', '!', 'Python很棒', '。', ''] # 注意最后一个空字符串是因为末尾分隔符后的子串 # 可以过滤空串 parts_filtered = [p for p in parts if p] print(parts_filtered) # ['你好', ',', '世界', '!', 'Python很棒', '。']
查找所有十六进制颜色值
目标:从CSS或HTML中找到所有#开头后跟6位或3位十六进制数字的颜色值。
import re
css_text = """
background-color: #ff5733;
color: #abc;
border: 1px solid #333333;
invalid: #ggg;
"""
# 匹配3或6位十六进制(不区分大小写)
pattern = r'#[0-9a-fA-F]{3}(?:[0-9a-fA-F]{3})?'
colors = re.findall(pattern, css_text)
print(colors) # 输出:['#ff5733', '#abc', '#333333']
检测密码强度(至少包含数字、大写、小写、特殊字符)
目标:检查密码是否满足安全要求(例如至少8位,含以上四种字符中的至少三种)。
import re
def password_strength(password):
# 分别检查各类字符是否存在
checks = {
'digit': bool(re.search(r'\d', password)),
'upper': bool(re.search(r'[A-Z]', password)),
'lower': bool(re.search(r'[a-z]', password)),
'special': bool(re.search(r'[!@#$%^&*(),.?":{}|<>]', password)),
'length': len(password) >= 8
}
score = sum(checks.values())
if score < 3:
return "弱"
elif score == 3:
return "中"
else:
return "强"
print(password_strength("abc123")) # 弱(长度不足)
print(password_strength("Pass123!")) # 强(4项满足)
print(password_strength("Abcdef1@")) # 强(4项满足)
替换字符串中的空格(包括全角、半角、连续多个)为单个空格
目标:标准化文本中的空白字符。
import re text = "Python 很棒, 但 Java 也不错。" normalized = re.sub(r'\s+', ' ', text).strip() print(normalized) # 输出:Python 很棒, 但 Java 也不错。 # 注意:全角空格属于Unicode空白,但仍会匹配 text2 = "你好 世界 !" # 含有全角空格 print(re.sub(r'\s+', ' ', text2)) # 输出:你好 世界 !
总结表
| 案例 | 核心模式 | 用途 |
|---|---|---|
| 邮箱验证 | ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ |
格式校验 |
| 提取域名 | https?://([a-zA-Z0-9.-]+) |
信息提取 |
| 手机号脱敏 | 1[3-9]\d{9} + lambda |
数据脱敏 |
| 分割保留分隔符 | 文本解析 | |
| 十六进制颜色 | #[0-9a-fA-F]{3}(?:[0-9a-fA-F]{3})? |
数据匹配 |
| 密码强度 | 联合多个re.search |
安全检查 |
| 空白归一化 | \s+ -> |
文本清洗 |
这些案例展示了正则表达式在验证、提取、替换、分割四大领域的典型用法,实际使用时注意编译正则表达式(re.compile)以提高重复调用性能,并合理使用原始字符串(r'...')避免转义问题。