> 文章列表 > 正则表达式识别日期

正则表达式识别日期

正则表达式识别日期

正则表达式识别日期

  • 正则表达式识别各种格式的日期

    import redef extract_dates(text):# 正则表达式,用于识别常见的日期格式date_pattern = r"""(?P<date>(?P<year_only>\\d{4}(?![\\d年]))|                                       # 单独的年份,如 2012,2017(?P<year>\\d{4})[-/年.](?P<month>\\d{1,2})[-/月.]?(?P<day>\\d{1,2})?[日]?|  # YYYY-MM-DD 或 YYYY/MM/DD 或 YYYY.MM.DD 或 YYYY年MM月DD日(?P<day2>\\d{1,2})[-/.](?P<month2>\\d{1,2})[-/.](?P<year2>\\d{4})|        # DD-MM-YYYY 或 DD/MM/YYYY 或 DD.MM.YYYY(?P<month3>\\d{1,2})[-/.](?P<day3>\\d{1,2})[-/.](?P<year3>\\d{2,4})        # MM-DD-YYYY 或 MM/DD/YYYY 或 MM.DD.YYYY)"""# 使用正则表达式查找日期"""re.VERBOSE是一个Python中的re模块的标志,用于在正则表达式中添加注释。使用re.VERBOSE可以让你在写复杂的正则表达式时更方便地组织你的代码,因为它允许你在正则表达式中使用注释,这样可以增强代码的可读性和可维护性。当你使用re.VERBOSE时,你需要在正则表达式中添加注释,注释可以是单行或多行的字符串。在注释中可以写明正则表达式的作用、匹配逻辑等等,以便于其他人理解和修改代码。"""matches = re.finditer(date_pattern, text, re.VERBOSE)result = []# 将匹配的日期添加到结果列表中for match in matches:
    """date_str = match.group('date'):从匹配结果中提取名为date的捕获组,即整个日期字符串。"""date_str = match.group('date')result.append(date_str)return result# 示例
    text = "这个报告是关于2010年3月3日的事件。昨天,即2023/4/10,我们讨论了2012年的计划。2010年3月,我们启动了一个新项目。"
    print(extract_dates(text))
    

    输出结果

    ['2010年3月3日', '2023', '2010年3月']
    
  • 正则表达式解释、程序解释

    这是一个用于从文本中提取日期的Python程序。程序定义了一个正则表达式date_pattern来匹配常见的日期格式,然后使用re.finditer()在给定文本中查找匹配的日期。匹配的日期将添加到结果列表中并返回。

    现在,让我们详细解释date_pattern正则表达式中的各个部分:

    1. (?P<date>:这是一个命名捕获组,名为date。整个正则表达式的目的是匹配一个完整的日期字符串,这个捕获组将包含最终匹配的日期。
    2. (?P<year_only>\\d{4}(?![\\d年])):这是一个命名捕获组,名为year_only。它用于捕获仅包含4位数字的年份(例如2012,2017)。(?![\\d年])是一个否定向前查找,表示年份后面不能是数字或“年”。
    3. |:表示或,用于在正则表达式中表示多个备选项之一。
    4. (?P<year>\\d{4})[-/年.](?P<month>\\d{1,2})[-/月.]?(?P<day>\\d{1,2})?[日]?:这是一个命名捕获组,分别名为yearmonthday。这个捕获组用于识别格式为 YYYY-MM-DD、YYYY/MM/DD、YYYY.MM.DD 或 YYYY年MM月DD日的日期。
    5. |:再次表示或,用于在正则表达式中表示多个备选项之一。
    6. (?P<day2>\\d{1,2})[-/.](?P<month2>\\d{1,2})[-/.](?P<year2>\\d{4}):这是一个命名捕获组,分别名为day2month2year2。这个捕获组用于识别格式为 DD-MM-YYYY、DD/MM/YYYY 或 DD.MM.YYYY 的日期。
    7. |:再次表示或,用于在正则表达式中表示多个备选项之一。
    8. (?P<month3>\\d{1,2})[-/.](?P<day3>\\d{1,2})[-/.](?P<year3>\\d{2,4}):这是一个命名捕获组,分别名为month3day3year3。这个捕获组用于识别格式为 MM-DD-YYYY、MM/DD/YYYY 或 MM.DD.YYYY 的日期。
    9. ):这是命名捕获组date的结尾括号。
  • re.find相关

    1. re.find
      re.find(pattern, string)函数可以用于在字符串中查找与正则表达式匹配的第一个子串,并返回匹配的对象。如果没有匹配到任何子串,则返回None。该函数只会返回找到的第一个匹配结果。
    2. re.finditer
      re.finditer(pattern, string)函数可以在字符串中查找与正则表达式匹配的所有子串,并返回一个迭代器。迭代器返回的每个元素都是匹配结果的对象。
    3. re.findall
      re.findall(pattern, string)函数可以用于在字符串中查找与正则表达式匹配的所有子串,并将它们以列表的形式返回。与re.finditer()返回的迭代器不同,re.findall()返回的是包含所有匹配结果的列表。如果没有找到匹配的子串,则返回一个空列表。
      总之,re.find()、re.finditer()和re.findall()函数可以帮助我们在一个字符串中查找与正则表达式匹配的子串,并将它们以不同的形式返回。使用这三个函数可以让我们更加方便地处理复杂的字符串。