首次出现可选正则表达式后,Negative Lookbehind停止

时间:2016-05-10 10:19:39

标签: regex python-2.7 regex-lookarounds

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

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

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

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

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

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

Picture of the regex problem

有什么建议吗? :)

谢谢!

2 个答案:

答案 0 :(得分:1)

正则表达式找到//website.com之前没有content="的{​​{1}}。所以返回一个匹配。

怎么样

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

答案 1 :(得分:1)

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

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

https:

Demo