You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python提取法语文本文件中多种格式的日期?

提取法语文本中的各类日期(Python实现)

处理这种多格式日期提取的问题,正则表达式是最直接的工具——毕竟你没法提前预知所有可能的格式,只能覆盖法语文本里最常见的几种场景。下面是我整理的一套方案,能覆盖你提到的所有示例格式,还能兼容更多常见变体:

步骤说明

  • 先定义法语月份的完整名称和常用缩写(避免漏抓缩写形式的日期)
  • 编写多个正则模式,分别匹配不同类型的日期
  • 合并模式并提取所有匹配结果,最后去重(避免重复提取同一日期)

完整代码实现

import re

def extract_french_dates(text):
    # 定义法语月份的全称和常用缩写(保留带重音的字符)
    french_months = r"(Janvier|Février|Mars|Avril|Mai|Juin|Juillet|Août|Septembre|Octobre|Novembre|Décembre|Jan|Fév|Mar|Avr|Mai|Jun|Jul|Aou|Sep|Oct|Nov|Déc)"
    
    # 模式1: 美式数字日期(MM/DD/YYYY 或 MM/DD/YY),支持1位/2位数字
    pattern_us_dates = r"\b(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01])/(19\d{2}|20\d{2}|\d{2})\b"
    
    # 模式2: 法语月份 + 4位年份(比如 Janvier 2005)
    pattern_french_month_year = rf"\b{french_months}\s(19\d{2}|20\d{2})\b"
    
    # 模式3: 单独的4位年份(限定19xx/20xx,避免误抓随机4位数)
    pattern_standalone_year = r"\b(19\d{2}|20\d{2})\b"
    
    # 合并所有模式,用|分隔实现多匹配
    combined_pattern = f"{pattern_us_dates}|{pattern_french_month_year}|{pattern_standalone_year}"
    
    # 提取所有匹配结果,忽略大小写兼容不同写法(比如janvier或JANVIER)
    matches = re.findall(combined_pattern, text, flags=re.IGNORECASE)
    
    # 处理匹配结果:从分组元组中提取非空项,并用集合去重
    unique_dates = set()
    for match_tuple in matches:
        for item in match_tuple:
            if item:
                unique_dates.add(item.strip())
    
    # 返回排序后的日期列表
    return sorted(unique_dates)

# 测试示例文本
sample_text = """
Exemples de dates: 04/30/2009, 06/20/98, 8/2/69, 1/25/2011, 9/3/2002, Janvier 2005, 1974, Fév 2010, Août 1999
"""

extracted_dates = extract_french_dates(sample_text)
print("提取到的日期:")
for date in extracted_dates:
    print(date)

代码细节解释

  • 法语月份覆盖:涵盖了所有月份的全称和常用缩写,同时通过re.IGNORECASE忽略大小写,确保不会漏抓février或FEVRIER这类变体。
  • 数字日期校验:正则里限制了月份为1-12、日期为1-31,能过滤掉明显无效的数字组合(比如13/32/2020),同时支持2位和4位年份。
  • 去重逻辑:用集合自动去重,避免同一日期在文本中多次出现时被重复提取。
  • 扩展性:如果后续发现新格式(比如30 Avril 2005这种日+月+年的法语格式),只需新增对应的正则模式到combined_pattern即可。

额外优化建议

  • 如果需要把提取到的日期统一转换成Python的datetime对象,可以用python-dateutil模块(先安装:pip install python-dateutil),它能自动识别多种格式,包括法语月份:
    from dateutil import parser
    for date_str in extracted_dates:
        try:
            dt = parser.parse(date_str, languages=['fr'])
            print(f"原始字符串: {date_str} -> 标准化日期: {dt.strftime('%Y-%m-%d')}")
        except:
            print(f"无法解析日期: {date_str}")
    
  • 对于2位年份的数字日期(比如06/20/98),可以手动设置规则转成4位(比如默认把69及以上的年份归为19xx,68及以下归为20xx),避免解析歧义。

内容的提问来源于stack exchange,提问作者benkam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:05:03