正则表达式:提取日期的表达式不适用于 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
这里您要创建一个匹配所有这些正则表达式的捕获组。
我正在尝试从文本数据中提取日期。当我检查 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
这里您要创建一个匹配所有这些正则表达式的捕获组。