我正在尝试掌握正则表达式,我发现了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上不可用。sedawk在这些情况下也有帮助。

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

10-12 23:56