10人参与 • 2025-12-11 • Python
在正则表达式中,零宽断言是控制匹配边界的“隐形指挥棒”。其中,负向先行断言(?!pattern)和负向后行断言(?<!pattern)堪称“排除大师”,能精准过滤不需要的上下文。本文将结合python的re模块,通过案例拆解其核心用法。
作用:检查当前位置之后是否不匹配指定模式,不消耗字符。
语法:(?!pattern)
示例:匹配不以“admin”开头的用户名称
import re pattern = r'^(?!admin)\w+$' print(re.match(pattern, "user123")) # 匹配成功 print(re.match(pattern, "adminuser")) # 匹配失败
作用:检查当前位置之前是否不匹配指定模式,不消耗字符。
语法:(?<!pattern)
示例:匹配前面不是美元符号的数字
pattern = r'(?<!\$)\d+' print(re.search(pattern, "123")) # 匹配123 print(re.search(pattern, "$456")) # 匹配失败
确保密码不包含用户名且符合复杂度要求:
import re
def validate_password(username, password):
# 排除用户名
if re.search(rf'(?i){username}', password):
return "密码不能包含用户名"
# 复杂度校验
rules = [
(r'.{8,}', "至少8位"),
(r'[a-z]', "包含小写字母"),
(r'[a-z]', "包含大写字母"),
(r'\d', "包含数字"),
(r'[!@#$%^&*]', "包含特殊字符")
]
failed_rules = [msg for pat, msg in rules if not re.search(pat, password)]
return failed_rules or "密码有效"
场景1:过滤不含“error”的日志行
log = """info: operation started error: disk full debug: debugging complete""" filtered = re.findall(r'^(?:(?!error).)*$', log, re.ignorecase | re.multiline) # 输出:['info: operation started\n', 'debug: debugging complete']
场景2:提取不包含“test”的url
urls = ['/api/user', '/test/v1', '/report/test'] valid_urls = [u for u in urls if re.search(r'^(?!.*test).+$', u)] # 输出:['/api/user']
示例:排除包含“admin”的路由
routes = ['/home', '/admin/dashboard', '/user/profile'] public_routes = [r for r in routes if not re.search(r'/admin', r)] # 输出:['/home', '/user/profile']
断言虽不消耗字符,但可能导致回溯灾难。例如:
^(?!.*admin).+$ # 在长文本中匹配时,引擎需遍历所有可能路径
优化建议:
\b等边界断言缩小范围re.compile()预编译模式(?<!pattern)中的模式为固定长度
# 错误示例(量词导致长度不定) re.search(r'(?<!\d+)\s', '123 ') # 引发re.error
]、-等字符时需正确转义案例:匹配包含大写字母但不包含“abc”的字符串
pattern = r'^(?=.*[a-z])(?!.*abc).+$' re.match(pattern, "xyz123") # 匹配成功 re.match(pattern, "abcdef") # 匹配失败
案例:提取不包含“税”字的金额
amounts = ["100.00", "税后200", "300元"]
valid = [a for a in amounts if re.match(r'^\d+\.?\d{0,2}$(?<!税)', a)]
# 输出:['100.00', '300元']
re.verbose注解提升可读性通过掌握?!与?<!的用法,您将能构建更精准的字符串处理逻辑,从密码校验到日志分析,这些技巧都能大显身手。建议结合python的re模块文档和实战代码深入练习,真正掌握这一进阶技能。
以上就是python正则表达式中?!的用法详解的详细内容,更多关于python正则表达式?!用法的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论