【问题标题】:Regex expression: Expression for Extracting Date is not working with Series object throws an error正则表达式:提取日期的表达式不适用于 Series 对象会引发错误
【发布时间】:2020-09-10 16:12:32
【问题描述】:

我正在尝试从文本数据中提取日期。当我在 regex101 网站上签入时,该表达式有效并且工作正常。但是当应用于数据时,它会引发错误“ValueError: pattern contains no capture groups”。我的示例文本是 ["Mar-20-2009", "Mar 20, 2009", "March 20, 2009", "Mar. 20, 2009"," Mar 20 2009"] 作为熊猫系列对象输入。

df2 = pd.Series(["Mar-20-2009", "Mar 20, 2009", "March 20, 2009", "Mar. 20, 2009"," Mar 20 2009"])
df2.str.extractall(r'(?:\d{2} )?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* (?:\d{2}, )?\d{4}')

它实际上与任何日期都不匹配,我的预期输出是 ["2009 年 3 月 20 日"、"2009 年 3 月 20 日"、"2009 年 3 月 20 日"]。 Screenshot of error

【问题讨论】:

    标签: python-3.x regex pandas regex-group


    【解决方案1】:

    所有带括号的表达式都是非捕获组 (?:),因此错误消息是正确的。如果要捕获表达式,请不要使用 ?: 将其放在括号中。照原样,模式将匹配,但不会捕获任何组。

    【讨论】:

      【解决方案2】:

      您需要将您的字符串包装在括号中的extractall中,如下所示:

      df2 = pd.Series(["Mar-20-2009", "Mar 20, 2009", "March 20, 2009", "Mar. 20, 2009"," Mar 20 2009"])
      df2.str.extractall(r'((?:\d{2} )?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]* (?:\d{2}, )?\d{4})')
      

      输出:

                            0
        match                
      1 0        Mar 20, 2009
      2 0      March 20, 2009
      

      在这里,您正在创建一个匹配所有这些正则表达式的捕获组。

      【讨论】:

      • 感谢@scott Boston 的澄清
      猜你喜欢
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      相关资源
      最近更新 更多