我试图了解正则表达式,但遇到了str.extract
方法中包含的一个正则表达式:
movies['year']=movies['title'].str.extract('.*\((.*)\).*',expand=True)
它应该检测并提取括号中的任何一个。因此,如果给出以下字符串:
foobar (1995)
,则应返回1995
。但是,如果我打开终端并输入以下内容echo 'foobar (1995)` | grep '.*\((.*)\).*'
与整个字符串匹配,而不是仅匹配括号之间的内容。由于括号的作用,我认为该方法适用于BRE风格,因此grep(默认行为)也是如此。另外,regex将整个字符串匹配为蓝色,将年份(捕获组)匹配为绿色。我在这里想念什么吗?正则表达式在python内完美工作
最佳答案
首先,Pandas .str.extract()
的行为是可以预料的:它仅返回捕获组的内容。 extract
使用的模式至少需要1个捕获组:
pat : string
具有捕获组的正则表达式模式
如果使用命名捕获组,则新列将以命名组命名。
您提供的grep
命令可以简化为
grep '\((.*)\)'
因为
grep
能够部分匹配一行(不需要完全匹配行),并且可以在每行的基础上工作:一旦找到匹配项,则返回整行。要覆盖该行为,可以使用-o
开关。使用
grep
,您无法返回捕获组的内容。可以使用带有-P
选项的PCRE regexp来解决此问题,但是例如在Mac上不可用。 sed
或awk
在这些情况下也可能会有所帮助。关于python - Pandas 的str.extract()中带有捕获组的正则表达式的预期行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57718728/