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

Expected behavior with regular expressions with capturing-groups in pandas' `str.extract()`

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

movies['year']=movies['title'].str.extract('.*\((.*)\).*',expand=True)

应该检测并提取括号中的那个。所以,如果给出这个字符串:foobar (1995) 它应该 return 1995。但是,如果我打开终端并输入以下内容

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

匹配整个字符串,而不是只匹配括号之间的内容。由于括号换码,我假设该方法适用于 BRE 风格,grep(默认行为)也是如此。此外,regex 以蓝色匹配整个字符串,以绿色匹配年份(捕获组)。我在这里错过了什么吗?正则表达式在 python

中完美运行

首先,Pandas .str.extract() 的行为是意料之中的:它 return 只是 捕获组 的内容。与 extract 一起使用的模式需要至少 1 个捕获组:

pat : string
Regular expression pattern with capturing groups

如果您使用命名捕获组,新列将以命名组命名。

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

grep '\((.*)\)'

as grep 能够匹配一行 部分 (不需要整行匹配)并且在每行基础上工作:一旦找到匹配项整行是 returned。要覆盖该行为,您可以使用 -o 开关。

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

试试这个:

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

  • 设置 expand= True 如果你想 return 一个 DataFrame 或应用多个捕获组。
  • 年份总是由4位数字组成。所以正则表达式:\((\d{4})\) 匹配括号之间的任何日期。