我试图掌握正则表达式,并且遇到了 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
Regular expression pattern with capturing groups
如果您使用命名捕获组,新列将以命名组命名。
您提供的grep
命令可以简化为
grep '\((.*)\)'
as grep
能够部分匹配行(不需要整行匹配)并在每行基础上工作:一旦找到整个匹配项返回线路。要覆盖该行为,您可以使用 -o
开关。
使用grep
,您无法返回捕获组内容。这可以通过使用 -P
选项支持的 PCRE 正则表达式来解决,但它在 Mac 上不可用。 sed
或 awk
在这些情况下也可能有所帮助。
关于python - pandas' `str.extract()` 中带有捕获组的正则表达式的预期行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44852589/