84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
请教一个正则表达式:"^(/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的话,把((?!:).)*外面再加个括号
返回结果