如何为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"))
关键修改说明
- 正则表达式优化:原正则会捕获日期后的非数字内容(比如空格),导致替换时连空格一起替换,简化后只匹配日期部分,保证替换精准。
- 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
相关产品推荐
相关产品推荐

