正则表达式相同,但Pandas vs. R中的结果不同

时间:2019-04-07 20:05:58

标签: python r regex pandas stringr

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

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

在Python(Pandas)和R(stringr)中运行它会产生完全不同的结果!

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"

在Pandas中,输出有点令人困惑

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

这是怎么了?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

  

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

请参见regex demo,突出显示的子字符串是您在.extractall中使用Pandas获得的值,因为此方法希望使用“ 具有捕获组的正则表达式模式”并返回“ DataFrame,每个匹配项有一行,每组有一列”。

R stringr::str_extract_all与熊猫extractall相反,在结果中省略了所有捕获的子字符串,只有“ 提取所有匹配项并返回字符向量列表”。

答案 1 :(得分:0)

将“ {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的解释: 重复限定符{m,n},其中m和n是十进制整数。此限定符表示必须至少重复m次,最多重复n次。

在上一个示例“ {2,}”中,您将m = 2设置为n,并且n设置为无穷大,这意味着图案应重复至少2次, 但是如果您将m = 1设置为“ {1,}”,它将接受一次出现,也等同于“ +”,即您可以替换r'(\ w [-\ w] +){1, }'到(r'(\ w [-\ w] +)+'仍然得到相同的结果