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

如何配置正则捕获组与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:25:20