根据文档, ^ 可以以多种方式使用:
[^abc] Any single character except: a, b, or c
^ Start of line
但我不明白它是如何在这里应用的。
在正则表达式中
(?!.*localhost)^.*$
^ 不在任何括号内,因此第二个适用。这是一个简单的例子:
/^x/
该正则表达式表示匹配行首,后跟字母 x。所以它会匹配这样的行:
xcellent
x-ray
但是,正则表达式与以下行不匹配:
axb
excellent
...因为 x 不会直接出现在行首之后。您可能想知道为什么 'axb' 不匹配。毕竟'a'是行的开头,后面是'x'。但是,“行首”就在第一个字符的左侧,如下所示:
|
V
axb
^ 被称为零宽度匹配,因为它匹配 'a' 左侧的细长条,例如在起始引号和 "axb" 中的 'a' 之间。那里实际上没有任何空间,所以 ^ 匹配 0 宽度的东西。
这是另一个例子:
/x^/
这表示匹配字符 x 后跟行首。好吧,没有一行可以先有一个 x ,然后是第二个行的开头,所以这永远不会匹配任何东西。
现在你的正则表达式:
(?!.*localhost)^.*$
就像“行首”^一样,前瞻是零宽度。这意味着前瞻扫描字符串以寻找匹配项,但是当它找到匹配项时,它会返回到字符串的开头,然后查找正则表达式的其余部分:
^.*$
一句忠告,当一个正则表达式需要环视(lookaheads 或lookbehinds)时,99% 的时间有更简单的方法来做你想做的事。例如,你可以写:
url = "....."
if url.index('http') == 0
#then the line starts with 'http'
else
#the line doesn't start with http
end
这更容易阅读,并且不需要尝试破译复杂的正则表达式。