Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 相同的正则表达式,但在熊猫和R_Python_R_Regex_Pandas_Stringr - Fatal编程技术网

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']