请教一个正则表达式:"^(/wiki/)((?!:).)*$)"
高洛峰
高洛峰 2016-11-10 15:39:43
0
3
802

请教一个正则表达式:
"^(/wiki/)((?!:).)*$)"
在抓取一个维基百科页面里所有的wiki文章链接时遇到的。
可以分析一下这个表达式后半部分吗?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(3)
三叔

写成这样,好理解些~

"(^(/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"


Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!