以下是 6道Python正则表达式进阶题,覆盖「分组捕获、零宽断言、贪婪/非贪婪、反向引用、Unicode匹配、替换回调」等核心进阶知识点,结合实际应用场景设计,附详细提示和解答:
题目1:复杂邮箱地址提取(分组+非捕获组+贪婪控制)
题目要求:
从混合文本中提取所有邮箱地址,需支持两种格式:
- 纯邮箱:user.name+tag@domain.co.uk(用户名含 .+_,域名支持多级子域)
- 带显示名的邮箱:“张三” 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标签内容提取与清理(零宽断言+多行模式)
题目要求:
- 从HTML片段中提取所有
…标签内的文本(忽略标签内的子标签,如 )
- 清理文本中的多余空格(连续空格合并为一个,首尾空格去除)
输入示例:
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:密码强度校验(正向先行断言+字符类)
题目要求:
设计正则表达式,校验密码是否满足以下所有条件:
- 长度 8-20 个字符
- 必须包含至少 1 个大写字母(A-Z)
- 必须包含至少 1 个小写字母(a-z)
- 必须包含至少 1 个数字(0-9)
- 必须包含至少 1 个特殊符号(!@#$%^&*()_±=[]{}|;:,.?~)
- 不能包含空格、制表符等空白字符
输入示例:
passwords = ["Pass123!", "weakpassword", "Strong@2025", "Short1!", "NoSpecial123", "Has Space1!"]
输出示例:
[True, False, True, False,

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



