提取所有日期 - 如何在 python 中使用 RegEx 分隔单个年份?

Extractall dates - how to separate single years with RegEx in python?

我的数据框的其中一列的测试中包含了一些日期。 例如,

sr = pd.Series(['04/20/2009', '04/20/09', '4/20/09', '4/3/09', '6/2008','12/2009','2010'])

我想提取这些日期.. 我一年的一半时间在 'month' 和 'day' 列中。

result = sr.str.extractall(r'(?P<month>\d{,2})[/]?(?P<day>\d{,2})[/]?(?P<year>\d{2,4})')
result

      month day year
  match         
0   0   04  20  2009
1   0   04  20  09
2   0   4   20  09
3   0   4   3   09
4   0   6   20  08
5   0   12  20  09
6   0   20  NaN 10

我该如何解决这个问题?

我只能想到将“'6/2008'、'12/2009'、'2010'”与“'04/20/2009'、'04/20/09'、'4/”分开处理20/09'",然后附加它们。

您可以使月份和日期的匹配更具体一些。

由于总是有一年,您可以将整个组的月份和日期设为可选。

在该可选组中,您可以将月份与可选日期匹配。

(?<!\S)(?:(?P<month>1[0-2]|0?[1-9])/(?:(?P<day>3[01]|[12][0-9]|0?[1-9])/)?)?(?P<year>(?:20|19)?\d{2})(?!\S)

部分

  • (?<!\S) 否定向后看,断言直接在左边的不是非空白字符(左边的空白边界)
  • (?:非捕获组
    • (?P<month>1[0-2]|0?[1-9])/后跟[=​​14=]
    • (?:非捕获组
      • (?P<day>3[01]|[12][0-9]|0?[1-9])/后跟[=​​14=]
    • )? 关闭组并使其可选
  • )? 关闭组并使其可选
  • (?P<year>(?:20|19)?\d{2}),可选择匹配20或19和2位数字
  • (?!\S) 否定前瞻,直接在右侧断言不是非空白字符(右侧的空白边界)

Regex demo