我正在尝试掌握正则表达式,我发现了str.extract
方法中包含的一个:
movies['year']=movies['title'].str.extract('.*\((.*)\).*',expand=True)
它应该检测并提取括号中的任何一个。所以,如果给定这个字符串:
foobar (1995)
它应该返回1995
。但是,如果我打开一个终端并键入以下内容echo 'foobar (1995)` | grep '.*\((.*)\).*'
匹配整个字符串,而不是仅匹配括号之间的内容。我假设这个方法是使用BRE-flavor的,因为括号被省略了,grep(默认行为)也是如此。此外,regex匹配蓝色的整个字符串和绿色的一年(捕捉组)。我是不是丢了什么东西?regex在python中工作得很好
最佳答案
首先,熊猫.str.extract()
的行为是很正常的:它只返回捕获组的内容。与extract
一起使用的模式至少需要一个捕获组:pat : string
带捕获组的正则表达式模式
如果使用命名捕获组,则新列将以命名组命名。
您提供的grep
命令可以简化为
grep '\((.*)\)'
因为
grep
能够部分匹配一行(不需要完整的行匹配),并且在每行的基础上工作:一旦找到匹配,就返回整行。要覆盖该行为,可以使用-o
开关。使用
grep
,无法返回捕获组内容。这可以通过使用-P
选项的PCRE regexp来解决,但它在Mac上不可用。sed
或awk
在这些情况下也有帮助。关于python - Pandas 的str.extract()中带有捕获组的正则表达式的预期行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44852589/