请教一个正则表达式:"^(/wiki/)((?!:).)*$)"在抓取一个维基百科页面里所有的wiki文章链接时遇到的。可以分析一下这个表达式后半部分吗?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
写成这样,好理解些~
"(^(/wiki/)([^:]*):$)"
>>> import re >>> s='/wiki/abc123D!@#%d:' >>> ptn2=re.compile("(^(/wiki/)([^:]*):$)") >>> ptn2.findall(s) [('/wiki/abc123D!@#%d:', '/wiki/', 'abc123D!@#%d')] >>>
(?!) 零宽度负预测先行断言,你这个例子里表示 /wiki/ 后可以跟 0 到多个任意字符,但此处首位不能是 :
再看了下,好像不对,((?!:).)* 有双层括号,那就是非 : 的任意字符了。
((?!:).)*匹配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"
写成这样,好理解些~
(?!) 零宽度负预测先行断言,你这个例子里表示 /wiki/ 后可以跟 0 到多个任意字符,但此处首位不能是 :
再看了下,好像不对,((?!:).)* 有双层括号,那就是非 : 的任意字符了。
((?!:).)*匹配0或任意多个不以:结尾的任意字符。可以在chrome控制台里直接尝试
返回结果
如果要匹配abc123D!@#%d的话,把((?!:).)*外面再加个括号
返回结果