如何用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
相关产品推荐
相关产品推荐

