我为re模块写了这个正则表达式,据我所知,它按预期工作:
^(https?://)([\w\.-]+)[\./]*(?(1)(domain-name.com))
针对网址列表运行,它仅匹配包含 domain-name.com 的网址。但我不明白为什么:
^(https?://)([\w\.-]+)[\./]*(?(1)(!(domain-name.com)))
不会返回所有其他网址。实际上它永远不会匹配任何东西。
谢谢
on pythex
答案 0 :(得分:1)
要匹配domain-name.com
个域名,请使用以下内容。
^https?://(?:\w+(?:-\w+)*\.)*domain-name\.com(?=$|/)
^
在行首处断言位置https?
匹配http
或https
(s
是可选的)://
按字面意思匹配(?:\w+(?:-\w+)*\.)*
匹配任意数量的子域。子域名不能以-
开头或结尾,因此此子模式执行如下操作:
\w+
匹配一个或多个单词字符(?:-\w+)*
符合以下任意次数
-
按字面意思匹配\w+
匹配一个或多个单词字符\.
字面匹配点字符domain-name\.com
按字面意思匹配domain-name.com
(?=$|[/?#])
肯定前瞻性,确保行尾{或/?#
中的字符要匹配非domain-name.com
域,请使用以下内容。
^https?://(?:\w+(?:-\w+)*\.)*(?!domain-name\.com)[\w-]+\.[\w-]+(?=$|/)
除了使用(?!domain-name\.com)[\w-]+\.[\w-]+
之外,这与第一个模式相同。这与任何字面上不匹配domain-name.com
的域匹配
答案 1 :(得分:0)
你需要使用负向前瞻?!而不是!
^(https?://)([\w\.-]+)[\./]*(?(1)(?!(domain-name.com)))