代码之家  ›  专栏  ›  技术社区  ›  ℕʘʘḆḽḘ

相同的正则表达式,但不同的结果在大熊猫与R

  •  0
  • ℕʘʘḆḽḘ  · 技术社区  · 5 年前

    考虑一下这个简单的正则表达式,它旨在提取标题

    (\w[\w-]+){2,}

    在Python中运行它( Pandas stringr )结果完全不同!

    提取工作正常:查看 'this-is-a-very-nice-test' 正确分析

    library(stringr)
    > str_extract_all('stackoverflow.stack.com/read/this-is-a-very-nice-test', 
    +                 regex('(\\w[-\\w]+){2,}'))
    [[1]]
    [1] "stackoverflow"            "stack"                    "read"                     "this-is-a-very-nice-test"
    

    myseries = pd.Series({'text' : 'stackoverflow.stack.com/read/this-is-a-very-nice-test'})
    
    myseries.str.extractall(r'(\w[-\w]+){2,}')
    Out[51]: 
                 0
         match    
    text 0      ow
         1      ck
         2      ad
         3      st
    

    这里怎么了?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Wiktor Stribiżew    5 年前

    这个 (\w[-\w]+){2,} 正则表达式表示 repeated capturing group

    重复捕获组将只捕获最后一次迭代

    看到了吗 regex demo .extractall 因为这个方法需要一个“ 捕获组的正则表达式模式 “并返回” DataFrame 每个匹配一行,每组一列

    与熊猫相反 extractall ,R stringr::str_extract_all 在其结果中省略所有捕获的子字符串,并且仅“

        2
  •  0
  •   Mahmoud Elshahat    5 年前

    将此部分“{2,}”更改为“{1,}”后,这是预期的工作

    import re
    s = 'stackoverflow.stack.com/read/this-is-a-very-nice-test'
    out = re.findall(r'(\w[-\w]+){1,}', s)
    print(out)
    

    输出:

    ['stackoverflow', 'stack', 'com', 'read', 'this-is-a-very-nice-test']
    

    编辑: python prespective的解释:

    在前面的例子{2,}中,将m=2和n设为无穷大,这意味着一个模式应该至少重复2次,