请教一个正则表达式:"^(/wiki/)((?!:).)*$)"

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

阅读 4.3k
3 个回答

((?!:).)*匹配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 到多个任意字符,但此处首位不能是 :


再看了下,好像不对,((?!:).)* 有双层括号,那就是非 : 的任意字符了。

写成这样,好理解些~

"(^(/wiki/)([^:]*):$)"
>>> import re
>>> s='/wiki/abc123D!@#%d:'
>>> ptn2=re.compile("(^(/wiki/)([^:]*):$)")
>>> ptn2.findall(s)
[('/wiki/abc123D!@#%d:', '/wiki/', 'abc123D!@#%d')]
>>> 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题