首次出现可选正则表达式后,否定后视停止
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))
我正在使用 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))