哪些Python案例展示了正则表达式?

wen python案例 3

本文目录导读:

哪些Python案例展示了正则表达式?

  1. 验证邮箱格式
  2. 提取网页链接中的域名
  3. 手机号脱敏(隐藏中间四位)
  4. 分割字符串并保留分隔符
  5. 查找所有十六进制颜色值
  6. 检测密码强度(至少包含数字、大写、小写、特殊字符)
  7. 替换字符串中的空格(包括全角、半角、连续多个)为单个空格
  8. 总结表

正则表达式(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'...')避免转义问题。

抱歉,评论功能暂时关闭!