如何用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
相关产品推荐
相关产品推荐

