请教一个正则表达式:
"^(/wiki/)((?!:).)*$)"
在抓取一个维基百科页面里所有的wiki文章链接时遇到的。
可以分析一下这个表达式后半部分吗?
三叔2016-11-10 15:41:43
写成这样,好理解些~
"(^(/wiki/)([^:]*):$)"
>>> import re >>> s='/wiki/abc123D!@#%d:' >>> ptn2=re.compile("(^(/wiki/)([^:]*):$)") >>> ptn2.findall(s) [('/wiki/abc123D!@#%d:', '/wiki/', 'abc123D!@#%d')] >>>
欧阳克2016-11-10 15:40:50
(?!) 零宽度负预测先行断言,你这个例子里表示 /wiki/ 后可以跟 0 到多个任意字符,但此处首位不能是 :
再看了下,好像不对,((?!:).)* 有双层括号,那就是非 : 的任意字符了。
三叔2016-11-10 15:40:39
((?!:).)*匹配0或任意多个不以:结尾的任意字符。可以在chrome控制台里直接尝试
var reg = /(\/wiki\/)((?!:).)*/g; var match = reg.exec('/wiki/abc123D!@#%d:');
返回结果
match[0] => "/wiki/abc123D!@#%d" match[1] => "/wiki/" match[2] => "d"
如果要匹配abc123D!@#%d的话,把((?!:).)*外面再加个括号
var reg = /(\/wiki\/)(((?!:).)*)/g; var match = reg.exec('/wiki/abc123D!@#%d:');
返回结果
match[0] => "/wiki/abc123D!@#%d" match[1] => "/wiki/" match[2] => "/abc123D!@#%d/" match[3] => "d"