日期的正则表达式显示为YYYY

2024-10-04 11:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能帮助我使用python的正则表达式,它完全匹配格式为yyyy,也就是说,它不应该匹配任何日期,比如mm-dd-yyyy/Month dd, yyyy/dd Month, yyyy

很容易找到以yyyy开头的匹配项。但当它处于中间或末端时,就变得越来越困难。所有其他格式的日期都已匹配。所以要避免重复。

例如:

  1. “在1984发生的火车事故造成了巨大的死亡人数”—应该是匹配的
  2. “其中一名受伤者死于Jun 10 1984”不应匹配
  3. 'Sep 15, 1984….'-不应匹配

Tags: 格式junsepddmm人数month火车
1条回答
网友
1楼 · 发布于 2024-10-04 11:22:15

只与字段匹配的“basic”regex是\d{4} 但这还不够。 我们必须在年前禁止:

  • 3个字母()和一个空格
  • 然后是2位数()和一个空格。在

这可以通过负lookbehind实现:

(?<!\w{3} \d{2} )

但请注意:

  • day字段之后,可以有一个可选的逗号(,
  • 但是否定的lookbehind不允许使用量词 使图案的宽度不固定

所以我们不能把,*放在字段之后。在

幸运的是,这个案子不是很复杂,我们可以绕过它 限制,使用两个否定lookbehind,一个后面有逗号 一天一天,另一天没有。在

因此,整个regex可以如下所示:

^{pr2}$

如果不允许在开头只使用实际的月份名称 (不是任何3个字母的单词),将\w{3}的两个实例替换为:

(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)

编辑

另一个解决方案是,“意识到”月份名称的完整名称是: 最初捕获两个组:

  • 可选的“信封”(非捕获)组,包括:
    • 一个单词(捕获组1,可能是月份名称)
    • 一个空格,两个数字(天),可选逗号和一个空格
  • 然后是4位数(捕获组2)。在

总而言之:

(?:(\w+) \d{2},* )?(\d{4})

然后,在后处理阶段,您必须:

  • 检查第一个捕获的组是否包含完整或缩写 任何月份的名称
  • 拒绝之前测试成功的案例。在

但是如果刚才提到的测试失败了,那么捕获组2包含 您要查找的年份字段。在

相关问题 更多 >