Python 相同的正则表达式,但在熊猫和R
考虑一下这个旨在提取标题的简单正则表达式Python 相同的正则表达式,但在熊猫和R,python,r,regex,pandas,stringr,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,}
在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"
在熊猫中,输出有点令人费解
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,}”更改为“{1,}”后,这是预期的工作 输出:
['stackoverflow', 'stack', 'com', 'read', 'this-is-a-very-nice-test']
编辑:
python透视图的解释:
重复限定符{m,n},其中m和n是十进制整数。这个限定符意味着必须有至少m次重复,最多n次
在前面的示例{2,}中,您将m=2和n设置为无穷大,这意味着一个模式应至少重复2次,
但是,如果您将m=1设置为“{1,}”,它将接受一次出现,也就是说,它相当于“+”,即您可以将r'(\w[-\w]+{1,}'替换为(r'(\w[-\w]+)+),并且仍然得到相同的结果,(\w[-\w]+){2,}
正则表达式表示:
重复捕获组将只捕获最后一次迭代
请参见,突出显示的子字符串是您在Pandas中使用的值,因为此方法需要“带有捕获组的正则表达式模式”,并返回“一个DataFrame
,每个匹配一行,每个组一列”
与Pandas
extractall
相反,R在其结果中省略所有捕获的子字符串,仅“提取所有匹配项并返回字符向量列表”。您不也希望看到“com”吗?可能是myseries.str.extractall(R'(\w[-\w]*)
和str extract\u all('stackoverflow.stack.com/read/this-is-a-very-nice-test',regex(“(\\w[-\\w]*)”)
或have{1,}
技术上,myseries.str.extractall(r'([\w-]+)
给出了您要查找的内容,尽管您无法避免匹配以连字符开头的文本(为了避免这种情况,请使用r'(\w[\w-])+)
)谢谢,但我不理解差异!谢谢,我知道我想我的观点是为什么同一个正则表达式返回不同的结果@ℕʘʘḆḽḘ 要使模式在两种环境中都工作,请使用(\w[\w-]{3,})
因为这就是您当前模式的含义:提取所有以单词字符开头的单词,然后提取3个或更多的单词或连字符。如果这不是您想要的,并且您需要修复,请告知真正的要求。谢谢!!我不明白捕获的子字符串和匹配之间的区别@ℕʘʘḆḽḘ 捕获的子字符串是与括号中的模式部分匹配的字符串。完整匹配是与整个模式匹配的字符串。请参阅参考。
['stackoverflow', 'stack', 'com', 'read', 'this-is-a-very-nice-test']