Python正则表达式6大进阶实战题

以下是 6道Python正则表达式进阶题,覆盖「分组捕获、零宽断言、贪婪/非贪婪、反向引用、Unicode匹配、替换回调」等核心进阶知识点,结合实际应用场景设计,附详细提示和解答:

题目1:复杂邮箱地址提取(分组+非捕获组+贪婪控制)

题目要求:

从混合文本中提取所有邮箱地址,需支持两种格式:

  1. 纯邮箱:user.name+tag@domain.co.uk(用户名含 .+_,域名支持多级子域)
  2. 带显示名的邮箱:“张三” zhangsan-123@mail.qq.com 或 李四 lisi@company.io(显示名可能带引号/空格,邮箱用尖括号包裹)

提取目标:

  • 每个邮箱需返回「显示名(无则为None)、用户名、完整域名」

输入示例:

text = '''
联系邮箱:"张三" <zhangsan-123@mail.qq.com>,备用邮箱 lisi+work@company.io,
还有 admin._root@sub.domain.com,以及错误格式 <invalid-email@.com>(需过滤)。
'''

输出示例:

[
    ("张三", "zhangsan-123", "mail.qq.com"),
    (None, "lisi+work", "company.io"),
    (None, "admin._root", "sub.domain.com")
]

涉及知识点:

非捕获组 (?😃、捕获组、贪婪/非贪婪匹配、字符类扩展、域名多级匹配

提示:

  • 显示名部分:可选,可能带双引号,用 (?:["']?(.?)["']?\s<)? 匹配
  • 用户名部分:允许 a-zA-Z0-9.±,用 [a-zA-Z0-9.±]+
  • 域名部分:支持多级子域(如 sub.domain.com),用 [a-zA-Z0-9-]+.[a-zA-Z0-9-.]+(注意避免匹配 .com. 这类非法结尾)

题目2:HTML标签内容提取与清理(零宽断言+多行模式)

题目要求:

  1. 从HTML片段中提取所有
    标签内的文本(忽略标签内的子标签,如 )
  2. 清理文本中的多余空格(连续空格合并为一个,首尾空格去除)

输入示例:

html = '''
<div class="header">标题</div>
<div class="content">
  这是第一段内容,<span style="color:red">包含子标签</span>,还有  多余  空格。
</div>
<div class="content">第二段内容,无子类<span>标签</span>,结尾有空格 </div>
<div class="footer">底部</div>
'''

输出示例:

[“这是第一段内容,包含子标签,还有 多余 空格。”, “第二段内容,无子类标签,结尾有空格”]

涉及知识点:

零宽断言(正向先行 (?<=)、反向先行 (?!))、多行模式 re.DOTALL、替换函数 re.sub

提示:

  • 用正向先行断言匹配
    开头,反向先行断言匹配
    结尾,避免捕获标签本身
  • 用 re.DOTALL 让 . 匹配换行符(标签内可能换行)
  • 用 re.sub(r’\s+', ’ ', text).strip() 清理空格

题目3:密码强度校验(正向先行断言+字符类)

题目要求:

设计正则表达式,校验密码是否满足以下所有条件:

  1. 长度 8-20 个字符
  2. 必须包含至少 1 个大写字母(A-Z)
  3. 必须包含至少 1 个小写字母(a-z)
  4. 必须包含至少 1 个数字(0-9)
  5. 必须包含至少 1 个特殊符号(!@#$%^&*()_±=[]{}|;:,.?~)
  6. 不能包含空格、制表符等空白字符

输入示例:

passwords = ["Pass123!", "weakpassword", "Strong@2025", "Short1!", "NoSpecial123", "Has Space1!"]

输出示例:

[True, False, True, False, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值