Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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 在pandas'中捕获组的正则表达式的预期行为`str.extract()`_Python_Regex_Pandas_Capturing Group - Fatal编程技术网

Python 在pandas'中捕获组的正则表达式的预期行为`str.extract()`

Python 在pandas'中捕获组的正则表达式的预期行为`str.extract()`,python,regex,pandas,capturing-group,Python,Regex,Pandas,Capturing Group,我试图掌握正则表达式,我遇到了str.extract方法中包含的正则表达式: movies['year']=movies['title'].str.extract('.*\((.*)\).*',expand=True) 它应该检测并提取括号中的任何一个。因此,如果给定这个字符串:foobar(1995)它应该返回1995。但是,如果我打开一个终端并键入以下内容 echo 'foobar (1995)` | grep '.*\((.*)\).*' 匹配整个字符串,而不是仅匹配括号之间的内容。我

我试图掌握正则表达式,我遇到了
str.extract
方法中包含的正则表达式:

movies['year']=movies['title'].str.extract('.*\((.*)\).*',expand=True)
它应该检测并提取括号中的任何一个。因此,如果给定这个字符串:
foobar(1995)
它应该返回
1995
。但是,如果我打开一个终端并键入以下内容

echo 'foobar (1995)` | grep '.*\((.*)\).*'

匹配整个字符串,而不是仅匹配括号之间的内容。我假设该方法使用BRE flavor,因为括号是scaping,grep(默认行为)也是如此。此外,蓝色和绿色分别代表整个字符串和年份(捕获组)。我是不是遗漏了什么?正则表达式在python中工作得非常好首先,Pandas的行为是意料之中的:它只返回捕获组的内容。与
extract
一起使用的模式至少需要一个捕获组:

pat:string

带有捕获组的正则表达式模式

如果使用命名的捕获组,则新列将以命名组的名称命名

您提供的
grep
命令可以简化为

grep '\((.*)\)'
由于
grep
能够部分匹配一行(不需要完整的行匹配),并且在每行的基础上工作:一旦找到匹配项,则返回整行。要覆盖该行为,可以使用
-o
开关

使用
grep
,您无法返回捕获组内容。这可以通过带有
-P
选项的PCRE regexp解决,但例如,它在Mac上不可用
sed
awk
在这些情况下也可能有帮助。

尝试使用以下方法:

movies['year']=movies['title'].str.extract('.\(\d{4})\).*,expand=False)

  • 如果希望它返回数据帧或应用多个捕获组时,请设置expand=True
  • 一年总是由4位数字组成。因此正则表达式:\(\d{4})\匹配括号之间的任何日期

默认情况下,GRIP返回与您的模式匹配的行。因此,请注意:如果您在MaCOSX上,IIRC,<代码> GRP由于删除-p选项而被禁用。我确实忘记了<代码> GRP返回匹配的行,如果我的答案在下面回答您的问题,请考虑接受/接受。否则,请发表评论,详细说明您仍需澄清的内容。