如何用正则仅为单个数字的日期、月份补前置0?
解决方案
核心修改点
- 将正则中的
\d{1,2}改为\d,仅匹配单个数字的日期/月份; - 调整正则结构,将上下文内容和单个数字分别捕获,替换时保留原有上下文,仅对单个数字补前置0;
- 移除未定义的变量引用,调整替换顺序避免重复处理。
修正后的代码
import re # 示例输入,可替换为其他示例 input_text = "Serian 4 unidades de mermelada para el dia 04 del 8 de este año 2023" # example 1 # input_text = "Hay 10 unidades para el dia 15 del 12 y seran 9 ya para el 7 de noviembre" # example 2 # input_text = "Hay 10 unidades para el 15 del 1º mes del año y seran alrededor de 9 para el 07º dia del mes de noviembre" # example 3 # 匹配不带º的日期:捕获上下文 + 单个数字 day_re1 = r"((?:del dia|de el dia|del|de el|el)[\s|]*)(\d)" # 匹配带º的日期:捕获单个数字 + 后续上下文 day_re2 = r"(\d)([\s|]*º[\s|]*dia)" # 匹配不带º的月份:捕获上下文 + 单个数字 month_re1 = r"((?:del mes|del|de el)[\s|]*)(\d)" # 匹配带º的月份:捕获单个数字 + 后续上下文 month_re2 = r"(\d)([\s|]*(?:º[\s|]*mes del año|º[\s|]*mes))" # 按顺序替换,先处理月份再处理日期(或反之不影响,按需调整) input_text = re.sub(month_re1, r"\10\2", input_text) input_text = re.sub(month_re2, r"0\1\2", input_text) input_text = re.sub(day_re1, r"\10\2", input_text) input_text = re.sub(day_re2, r"0\1\2", input_text) print(repr(input_text))
代码说明
- 每个正则都将上下文和单个数字分为两个捕获组,替换时通过反向引用
\1保留上下文,给捕获的单个数字\2添加前置0; - 带º的场景中,数字在前、上下文在后,所以替换时用
0\1\2给数字补0后保留后续的º mes/º dia内容; - 仅匹配单个数字
\d,不会对两位数字(如04、15)进行修改,符合需求。
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

