首页 > 解决方案 > 加快正则表达式以禁止 URL 中的单词列表

问题描述

我正在研究一个正则表达式,旨在禁止在 url 中包含某些单词的本地网站。网站的结构是:http|https://mysite.si,禁止词可能出现在“.si”之前或之后(在路径中)。我这样做是因为我的内容过滤器不太擅长阻止我不希望我的孩子接触到的本地网站。到目前为止,我想出了以下内容:

(?!.*(word1|word2|word3...|wordx))(https|http)://.*[.]si

其中 wordx 表示禁用词。虽然我很高兴以上过滤掉了我希望它过滤掉的内容,但我发现性能太慢(单词列表由 400 个单词组成)并且希望有任何提高性能的建议。

标签: pythonregexregex-negation

解决方案


https?://您可以通过首先更改与协议的交替并匹配协议,然后在其后添加负前瞻来使模式性能稍好一些。

为了匹配字符串,如果不能有空格,您可以将 更改.*\S*匹配非空白字符。

如果您可能知道哪些词比其他词出现得更多,则可以在开头添加更频繁的词,例如使量词不贪婪以更快地获得断言结果。

为了防止部分匹配,您可以\b在模式周围添加单词边界。

根据单词列表,您还可以\b(?:word1|word2|word3)\b在组周围添加单词边界。

\bhttps?://(?!\S*?(?:word1|word2|word3...|wordx))\S*[.]si\b

推荐阅读