所以我有一个正则表达式,它阻止了消息中的URL,但我想把网站的URL列入白名单。
目前,它可以与任何前缀,如HTTP://www.example.com和www.example.com/support/how-do-i-setup-this,但如果我把另一个URL后面,然后它通过过滤器,我不想(只有当我把新的URL在一个新的行,它会被阻止所需)
“go to http://example.com/support/how-do-iwww.badurl.com“这不会阻止我想要发生的badurl
这个字符串也会导致两个都被阻止“www.badurl.comexample.com”,但理想情况下,我想在这里也白名单example.com网址
[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,24}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?(?<!\bexample.com(/.*)?)
当前python函数代码
import re
def link_remover(message):
#remove any links that aren't in whitelist
message = re.sub(r"[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,24}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?(?<!\bexample.com)", "[URL Removed]", message)
return message
所以我只是想知道如何编辑它来修复这两个失败的例子?
我很感激任何回应或为我指出正确的方向:)
1条答案
按热度按时间cigdeys31#
最终更新:
添加了一个负的后看边界,开始对白名单项目的每次检查。
示例:
(?<=(?<![-a-z\u00a1-\uffff0-9])example\.com)
这个类确保只有一个可选的 Subdomain 可以出现在它之前。
作为正则表达式的唯一可选部分,只允许使用点或正斜杠。
因此,没有字母出血可以与它相邻,例如
wrongexample.com
。这是白名单项目可选匹配的示例。
每一个url都是匹配的。白名单检查策略性地放在域名之后
匹配。因此,匹配将包含任何尾随的可选端口或目录。
一个lambda回调就可以检查白名单中是否有匹配的url。
如果是这样的话,就把它们原封不动地写回来。
如果不匹配,则写回 Removed 字符串。
修改逻辑:
更改为仅需要一个捕获组。
group 用作标记。
如果组为 * 无 *,则未找到匹配的白名单项。
在回调中返回
return {Empty}
并覆盖错误的url。否则,找到白名单项。匹配项将返回不变。
return m.group(0)
*。注:
所有url都匹配。单个捕获组。无限数量的白名单项目。
按照下面的模板添加白名单项目。
https://regex101.com/r/rCBd0P/1
Python代码示例:
输出:
正则表达式扩展: