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

如何为re.sub()中调用的回调函数传递参数?

问题解决:在re.sub中给回调函数传递额外参数

原代码的核心问题是re.sub调用回调函数时,默认只会把匹配对象m传入,但你的回调还需要type_of_date_unit_used参数,直接传参会触发参数缺失错误。下面是两种可行的修正方案:

方案一:用Lambda表达式包装回调

直接在re.sub里用lambda接收匹配对象,再调用目标函数并传入额外参数:

import re

def one_day_or_another_day_relative_to_a_date_func(m, type_of_date_unit_used):
    input_text = m.group()

    print(repr(input_text))

    if type_of_date_unit_used == "year":
        a = "YYYY-mm-dd"
    elif type_of_date_unit_used == "month":
        a = "yyyy-MM-dd"
    elif type_of_date_unit_used == "day":
        a = "yyyy-mm-DD"
    
    return a


def identify_one_day_or_another_day_relative_to_a_date(input_text, type_of_date_unit_used = "day"):
    # 简化正则,只匹配日期部分,避免误替换日期后的非数字内容
    date_capture_pattern = r"([123456789]\d*-[01]\d-[0-3]\d)"

    # 用lambda包装,传递匹配对象和额外参数给回调
    input_text = re.sub(
        date_capture_pattern,
        lambda m: one_day_or_another_day_relative_to_a_date_func(m, type_of_date_unit_used),
        input_text,
        flags=re.IGNORECASE
    )

    return input_text


input_text = "En 2012-06-12 empezo y termino en algun dia del 2023"
print(identify_one_day_or_another_day_relative_to_a_date(input_text, "month"))

方案二:用functools.partial绑定参数

通过functools.partial预先绑定额外参数,生成一个只接收匹配对象的新函数:

import re
from functools import partial

def one_day_or_another_day_relative_to_a_date_func(m, type_of_date_unit_used):
    input_text = m.group()

    print(repr(input_text))

    if type_of_date_unit_used == "year":
        a = "YYYY-mm-dd"
    elif type_of_date_unit_used == "month":
        a = "yyyy-MM-dd"
    elif type_of_date_unit_used == "day":
        a = "yyyy-mm-DD"
    
    return a


def identify_one_day_or_another_day_relative_to_a_date(input_text, type_of_date_unit_used = "day"):
    date_capture_pattern = r"([123456789]\d*-[01]\d-[0-3]\d)"

    # 预先绑定type_of_date_unit_used参数
    bound_func = partial(one_day_or_another_day_relative_to_a_date_func, type_of_date_unit_used=type_of_date_unit_used)
    input_text = re.sub(
        date_capture_pattern,
        bound_func,
        input_text,
        flags=re.IGNORECASE
    )

    return input_text


input_text = "En 2012-06-12 empezo y termino en algun dia del 2023"
print(identify_one_day_or_another_day_relative_to_a_date(input_text, "month"))

关键修改说明

  1. 正则表达式优化:原正则会捕获日期后的非数字内容(比如空格),导致替换时连空格一起替换,简化后只匹配日期部分,保证替换精准。
  2. flags参数修正:原代码把re.IGNORECASE放在了re.sub的第4位(替换次数参数位),这会导致逻辑错误,现在单独通过flags参数传递。

运行修正后的代码,会得到预期输出:

'2012-06-12'
En yyyy-MM-dd empezo y termino en algun dia del 2023

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:35:52