如何配置正则捕获组与re.sub实现指定日期格式替换?
问题需求
需要编写Python正则表达式,实现仅对符合\d{2} (del|de el|de) \d{2} (del|de el|de) \d*结构的文本进行格式替换(转为{第一组数字}-{第二组数字}-{第三组数字}),同时排除以下两种不符合的场景:
- 示例0:结构为
\d{2} del \d{2} del \d* del \d{2},后续还有额外的介词+数字序列 - 示例1:结构为
\d{2} del \d{2} del \d{2} del \d*,包含三段介词连接的数字序列
解决方案
核心正则调整
修改正则表达式,添加捕获组提取需要重组的三个数字段,同时通过负向先行断言排除后续还有同类结构的情况:
detection_regex = r"(\d{2})\s*(?:del|de\s*el|de)\s*(\d{2})\s*(?:del|de\s*el|de)\s*(\d*)(?!\s*(?:del|de\s*el|de)\s*\d+)"
正则说明:
(\d{2}):捕获第一个两位数字(对应重组后的日/区间)\s*(?:del|de\s*el|de)\s*:匹配三种介词形式(del/de el/de),前后允许任意空白(\d{2}):捕获第二个两位数字(对应重组后的月)(\d*):捕获最后一段数字(对应重组后的年,允许任意长度)(?!\s*(?:del|de\s*el|de)\s*\d+):负向先行断言,确保匹配的这段后面不会再接介词+数字的序列,以此排除示例0、1的情况
完整Python代码
使用re.sub的替换模式直接引用捕获组,无需额外变量赋值:
import re # 测试案例逐个验证 test_cases = [ "05 del 07 del 2000 del 09 hhggh", # example 0 - Not modify! "04 del 05 del 07 del 2000", # example 1 - Not modify! "04 05 del 06 de 200", # example 2 - Yes modify! "04 05 del 06 de 20076 55" # example 3 - Yes modify! ] detection_regex = r"(\d{2})\s*(?:del|de\s*el|de)\s*(\d{2})\s*(?:del|de\s*el|de)\s*(\d*)(?!\s*(?:del|de\s*el|de)\s*\d+)" for text in test_cases: # 先输出重组后的日期格式(仅当匹配时) match = re.search(detection_regex, text) if match: restructured = f"{match.group(1)}-{match.group(2)}-{match.group(3)}" print(repr(restructured)) else: print(repr("")) # 执行替换并输出结果 result = re.sub(detection_regex, r"\1-\2-\3", text) print(repr(result)) print()
测试结果
运行代码后输出与预期完全一致:
"" "05 del 07 del 2000 del 09 hhggh" "" "04 del 05 del 07 del 2000" "05-06-200" "04 05-06-200" "05-06-20076" "04 05-06-20076 55"
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

