首页  >  问答  >  正文

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

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

高洛峰高洛峰2871 天前774

全部回复(3)我来回复

  • 三叔

    三叔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')]
    >>>


    回复
    0
  • 欧阳克

    欧阳克2016-11-10 15:40:50

    (?!) 零宽度负预测先行断言,你这个例子里表示 /wiki/ 后可以跟 0 到多个任意字符,但此处首位不能是 :

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


    回复
    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"


    回复
    0
  • 取消回复