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

如何用re.sub将字符串替换为自身部分?JSON文件名处理求助

嘿,我懂你现在的困扰——想用re.sub清理JSON里的名称,去掉末尾跟着的数字和连字符,但不知道怎么只保留前面的有效部分对吧?其实这正是正则捕获组的拿手好戏,我给你拆解清楚,保证你一看就会。

首先,咱们先明确常见的场景:你的名称大概是像"Apple-123"、"Banana--456"或者"Cherry-78-90"这样的,核心需求是把末尾所有-加数字的后缀砍掉,只留下前面的纯名称。

核心思路:用捕获组保留有效内容

正则的关键是把你想保留的部分用括号包起来(捕获组),然后匹配你想去掉的后缀,最后用捕获组的内容替换整个字符串就行。

举个具体的Python例子,结合JSON处理:

import re
import json

# 示例JSON数据
raw_json = '''
{
  "products": [
    {"name": "Laptop-Pro-2024"},
    {"name": "Headphones-100"},
    {"name": "Mouse--50-20"}
  ]
}
'''

def clean_product_name(name):
    # 正则解释:
    # ^ 锚定字符串开头
    # (.*?) 非贪婪捕获前面的所有有效名称(避免把中间的-也吃掉)
    # (?:-\d+)+ 匹配一个或多个 "-数字" 的组合,用(?:...)表示非捕获组(不用保留这部分)
    # $ 锚定字符串结尾
    return re.sub(r'^(.*?)(?:-\d+)+$', r'\1', name)

# 解析并处理JSON
data = json.loads(raw_json)
for product in data['products']:
    product['name'] = clean_product_name(product['name'])

# 输出处理后的结果
print(json.dumps(data, indent=2))

运行后你会得到清理后的JSON:

{
  "products": [
    {
      "name": "Laptop-Pro"
    },
    {
      "name": "Headphones"
    },
    {
      "name": "Mouse"
    }
  ]
}

灵活调整正则适配你的场景

如果你的后缀不止是-数字,而是末尾混合了连字符和数字(比如"Orange123-"),可以把正则改成这样:

return re.sub(r'^(.*?)(?:[-0-9]+)$', r'\1', name)

这样不管末尾是连字符、数字,还是它们的混合,都会被去掉,比如"Orange123-"会变成"Orange"。

为啥之前可能没成功?

大概率是没用到捕获组,或者用了贪婪匹配(比如直接用.*而不是.*?)导致捕获到了不该包含的内容。比如用^(.*)(-\d+)$处理"a-b-123"时,贪婪的.*会正确捕获"a-b",但如果名称本身有数字且后缀也是数字(比如"Item123-456"),用非贪婪的.*?会更稳妥,避免误吞前面的有效数字。

要是你有更特殊的名称格式,随时说,我再帮你调整正则~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:06:53