【问题标题】:Expected behavior with regular expressions with capturing-groups in pandas' `str.extract()`pandas `str.extract()` 中带有捕获组的正则表达式的预期行为
【发布时间】:2020-01-03 05:38:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • grep 默认返回与您的模式匹配的
  • 另外,如果您在 MacOsX、IIRC 上,grep 已因删除 -P 选项而受到阻碍。
  • 我真的一直忘记grep返回匹配行
  • 如果我在下面的回答回答了您的问题,请考虑支持/接受。否则,请发表评论,其中包含您仍需要澄清的细节。

标签: python regex pandas capturing-group


【解决方案1】:

试试这个:

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

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

【讨论】:

    【解决方案2】:

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

    pat : string
    带有捕获组的正则表达式模式

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

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

    grep '\((.*)\)'
    

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

    使用grep,您无法返回捕获组内容。这可以通过带有-P 选项的 PCRE 正则表达式来解决,但它在 Mac 上不可用,例如。 sedawk 在这些情况下也可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-05-22
      • 2015-08-20
      • 2017-02-16
      • 1970-01-01
      • 2022-01-20
      • 2018-08-15
      • 2014-09-23
      相关资源
      最近更新 更多