我试图了解正则表达式,但遇到了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上不可用。 sedawk在这些情况下也可能会有所帮助。

关于python - Pandas 的str.extract()中带有捕获组的正则表达式的预期行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57718728/

10-13 03:53