首次出现可选正则表达式后,否定后视停止

Negative Lookbehind stops after first occurrence of an optional regex

我正在使用 Python 中的以下正则表达式从 HTML 文件中的链接中删除协议:

re.sub(r"((http:|https:)?(\/\/website.com))", r"", result)

这按预期工作,但我不想在属性为 content 时替换协议。所以我开始研究使用 Regex Negative Lookbehind。

(?<!content=")(http:|https:)?(\/\/website.com)

这个正则表达式应该基本上意味着如果字符串以 <content=" 开头,那么它不应该匹配其余部分。但问题是它只拒绝可选的正则表达式 (http:|https:)?,可能是因为它是可选的。如果它不是可选的,它会拒绝整行。

这是清楚显示问题的屏幕截图。第一行应该完全拒绝,但它只是拒绝了协议。

有什么建议吗? :)

谢谢!

正则表达式找到 //website.com 前面没有 content="。所以returns一场比赛。

怎么样

(?<!content="|content="http:|content="https:)(http:|https:)?(\/\/website.com)

原始正则表达式的问题在于它匹配 //website.com 之前没有 content=",因为 http:/https: 是可选的。要解决此问题,您可以在负面回溯中包含该协议。

由于 Python 不支持可变长度后视,您可以执行以下操作:

(?<!content=")(?<!content="https:)(?<!content="http:)((https?:)?(//website.com))

Demo