考虑这个旨在提取标题的简单正则表达式
(\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
这是怎么了?
谢谢!
答案 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] +)+'仍然得到相同的结果