回复:在熊猫数据框中组合多个正则表达式

时间:2018-11-24 13:14:41

标签: python regex pandas text-mining

我有一个看起来像这样的数据集:

0         03/25/93 Total time of visit (in minutes):\n
1                       6/18/85 Primary Care Doctor:\n
2    sshe plans to move as of 7/8/71 In-Home Servic...

,其中包含不同格式的日期,例如:

04/20/2009; 04/20/09; 4/20/09; 4/3/09
Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;
20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009
Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009

我需要提取日期并按升序对它们进行排序,并遵循以下规则:

  • 假设日期以MM / DD / YY
  • 假设日期用两位数字编码年份

我必须按时间顺序返回正确日期的熊猫系列:

例如,如果系列是这样的:

0    1999
1    2010
2    1978

我需要返回以下系列:

0    2
1    4
2    0

,其中第一列是索引,第二列是出现在数据集中的计数(年)。例如,如果1999年出现两次,它将在第二列中返回double(2)。

我已经能够提取和匹配日期模式,但是我无法将它们组合成单个表达式以匹配整个数据帧:

re1 = df.str.extract(r'((?:\d{,2}\s)?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*(?:-|\.|\s|,)\s?\d{,2}[a-z]*(?:-|,|\s)?\s?\d{2,4})')
re2 = df.str.extract(r'((?:\d{1,2})(?:(?:\/|-)\d{1,2})(?:(?:\/|-)\d{2,4}))')
re3 = df.str.extract(r'((?:\d{1,2}(?:-|\/))?\d{4})')

如何将上述正则表达式组合成单个表达式并将其作为Series返回?

1 个答案:

答案 0 :(得分:0)

您可以使用

((?:\d{0,2}\s)?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*[-.\s,]\s?\d{0,2}[a-z]*[-,\s]?\s?\d{2,4}|\d{1,2}[/-]\d{1,2}[/-]\d{2,4}|(?:\d{1,2}[-/])?\d{4})

请参见regex demo

关键是要使用|运算符加入零件,同时保持所有内部组不被捕获。外部组必须正在捕获,以便extract可以输出匹配项。