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 上不可用,例如。 sed
或 awk
也可能在这些情况下有所帮助。
试试这个:
movies['year']= movies['title'].str.extract('.*\((\d{4})\).*',expand=False)
- 设置 expand= True 如果你想 return 一个 DataFrame 或应用多个捕获组。
- 年份总是由4位数字组成。所以正则表达式:\((\d{4})\) 匹配括号之间的任何日期。
我正在尝试掌握正则表达式,我遇到了 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 上不可用,例如。 sed
或 awk
也可能在这些情况下有所帮助。
试试这个:
movies['year']= movies['title'].str.extract('.*\((\d{4})\).*',expand=False)
- 设置 expand= True 如果你想 return 一个 DataFrame 或应用多个捕获组。
- 年份总是由4位数字组成。所以正则表达式:\((\d{4})\) 匹配括号之间的任何日期。