正则URL白名单规则问题:同行违规URL未拦截及域名连写误判
解决URL拦截正则的两个问题
问题分析
你当前的正则存在两个核心问题:
- 同行的白名单URL会干扰违规URL的匹配,导致后者无法被拦截
- 连写域名(如
www.badurl.comexample.com)会被整体匹配拦截,无法保留白名单的example.com部分
修改方案
直接调整正则表达式,修正匹配逻辑,同时修复原代码中HTML实体转义的错误(把&改为&,否则无法匹配含&的URL)。修改后的代码如下:
import re def link_remover(message): # 匹配所有非白名单URL,排除example.com及其子域名、带路径的合法链接 pattern = r'\b(?!(?:https?://)?(?:www\.)?example\.com(?:/.*)?\b)(?:https?://)?(?:www\.)?[-a-zA-Z0-9@:%_+.~#?&/=]{2,256}\.[a-z]{2,24}\b(?:/[-a-zA-Z0-9@:%_+.~#?&/=]*)*' message = re.sub(pattern, "[URL Removed]", message) return message
关键改进点
解决同行URL拦截问题:
添加了正向负预查(?!(?:https?://)?(?:www\.)?example\.com(?:/.*)?\b),精准排除所有example.com相关的白名单链接(包括带http/https前缀、www前缀、带路径的情况),确保同行的违规URL能被正常匹配替换。解决连写域名问题:
通过\b单词边界和域名匹配规则,正则会优先匹配到违规域名的合法结尾(如.com),后续的example.com会被识别为独立的白名单链接,从而只替换违规部分,保留example.com。
测试验证
- 输入:
Check http://www.example.com and www.badurl.com
输出:Check http://www.example.com and [URL Removed] - 输入:
www.badurl.comexample.com
输出:[URL Removed]example.com
内容的提问来源于stack exchange,提问作者AlphaDjango
相关产品推荐
相关产品推荐

