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

Python 显示为YYYY的日期的正则表达式,python,regex,date,Python,Regex,Date,有人能帮助我使用python正则表达式,它完全以yyyy格式匹配日期,即它不应该匹配任何日期,例如mm-dd-yyyy/Month-dd,yyyyy/dd-Month,yyyy等 在文本以yyyy开头的地方很容易找到这样的匹配项。但是当它在中间或末端时变得越来越困难。strong>所有其他格式的日期都已匹配。因此要避免重复。 例: “1984年的火车事故造成了巨大的死亡人数”-应该匹配 “其中一名伤者于1984年6月10日受伤死亡”不应匹配 “1984年9月15日…”不应该匹配 仅匹配年份字段的

有人能帮助我使用python正则表达式,它完全以
yyyy
格式匹配日期,即它不应该匹配任何日期,例如
mm-dd-yyyy
/
Month-dd,yyyyy
/
dd-Month,yyyy

在文本以
yyyy
开头的地方很容易找到这样的匹配项。但是当它在中间或末端时变得越来越困难。strong>所有其他格式的日期都已匹配。因此要避免重复。

例:

  • “1984年的火车事故造成了巨大的死亡人数”-应该匹配
  • “其中一名伤者于1984年6月10日受伤死亡”不应匹配
  • 1984年9月15日
    …”不应该匹配
  • 仅匹配年份字段的“基本”正则表达式是
    \d{4}
    但这还不够。 我们必须禁止在该年发生之前:

    • 3个字母(月)和一个空格
    • 然后是两个数字(天)和一个空格
    这可以通过反向后视来实现:

    如果希望在开始时仅禁止实际月份名称 (不是任何三个字母的单词),将
    \w{3}
    的两个实例替换为:

    (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
    
    编辑 另一个解决方案是,“意识到”月份全名是: 最初捕获两组:

    • 可选的“信封”(非捕获)组,包括:
      • 一个单词(捕捉第一组,可能是月份名称)
      • 一个空格、两位数字(天)、可选逗号和一个空格
    • 然后是4位数字(捕捉组编号2)
    总而言之:

    (?:(\w+) \d{2},* )?(\d{4})
    
    然后,在后处理阶段,您必须:

    • 检查第一个捕获的组是否包含完整组或缩写组 任何月份的名称
    • 拒绝之前测试成功的情况
    但是如果刚才提到的测试失败,那么捕获组2包含
    您要查找的年份字段。

    那么您只需要一个四位数的数字
    \b\d{4}\b
    是否可以在1984年9月15日的
    中匹配1984?条件是四位数字不应该跟在月名
    (一月或一月或九月或九月)
    /日期数字
    (10,10-
    后面加空格<1984年9月15日<代码>中的代码>1984
    不应匹配<代码>\b\d{4}\b与任何内容都不匹配。单词结尾不能与数字一起使用。如果我错了,请纠正我。在后处理过程中,regex并不是为不规则模式而发明的(即,模式之间有很大差异,例如1948年1月15日和1948年1月15日)。一个覆盖所有可能的情况的正则表达式模式将是巨大而可笑的低效。只剩下4位数字。
    (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
    
    (?:(\w+) \d{2},* )?(\d{4})