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})\匹配括号之间的任何日期