Python 3.x 正则表达式:用于提取日期的表达式不适用于序列对象,因此引发错误

Python 3.x 正则表达式:用于提取日期的表达式不适用于序列对象,因此引发错误,python-3.x,regex,pandas,regex-group,Python 3.x,Regex,Pandas,Regex Group,我正试图从文本数据中提取日期。当我登录regex101网站时,该表达式是有效的,工作正常。但是当应用到数据时,它会抛出一个错误“ValueError:pattern不包含捕获组”。我的示例文本是[“Mar-20-2009”、“Mar-20-2009”、“Mar-20-2009”、“Mar.20-2009”、“Mar-20-2009”]作为熊猫系列对象输入的 df2 = pd.Series(["Mar-20-2009", "Mar 20, 2009", &q

我正试图从文本数据中提取日期。当我登录regex101网站时,该表达式是有效的,工作正常。但是当应用到数据时,它会抛出一个错误“ValueError:pattern不包含捕获组”。我的示例文本是[“Mar-20-2009”、“Mar-20-2009”、“Mar-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日”]。

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

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