正则表达式:提取日期的表达式不适用于 Series 对象会引发错误

Regex expression: Expression for Extracting Date is not working with Series object throws an error

我正在尝试从文本数据中提取日期。当我检查 regex101 网站时,该表达式有效并且工作正常。但是当应用于数据时,它会抛出错误“ValueError:模式不包含捕获组”。我的示例文本是 ["Mar-20-2009", "Mar 20, 2009", "March 20, 2009", "Mar.20, 2009","Mar 20 2009"] 作为 pandas 系列输入对象。

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

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

您需要将您的字符串包裹在括号中的 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

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