Extractall 日期 - 如何在 python 中使用 RegEx 分隔单个年份?

Blu*_*ail 1 regex date regex-group python-3.x pandas

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

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

我想提取这些日期......我一年中有一半的时间在“月”和“日”列中结束。

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

Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

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

The*_*ird 6

您可以针对月份和日期使匹配更加具体。

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

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

(?<!\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)
Run Code Online (Sandbox Code Playgroud)

在零件中

  • (?<!\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})年份,可选择匹配 20 或 19 和 2 位数字
  • (?!\S) 负前瞻,断言不是直接在右侧的非空白字符(右侧的空白边界)

正则表达式演示