Python中命名版本自动递增逻辑异常,求正则解决方案
解决版本命名自动升级的正则匹配问题
你的核心问题是没正确识别已有的_vN后缀,导致直接追加新后缀而非升级版本号。下面是修正后的实现方案:
核心思路
- 用正则精准匹配带版本后缀的命名格式(如
xxx_v1),拆分出基础名称和当前版本号 - 遍历现有名称列表,找出同一基础名称下的所有版本号,取最大值加1生成新名称
- 对于无版本后缀的名称,默认原名称为
v1,直接生成xxx_v2及后续版本
代码实现
import pandas as pd import re # 匹配结尾为_v数字的正则模式,捕获基础名称和版本号 version_pattern = re.compile(r'^(.*)_v(\d+)$') def generate_new_name(existing_names, target_name): # 检查目标名称是否带版本后缀 match = version_pattern.match(target_name) if match: base_name, current_v = match.groups() current_v = int(current_v) # 筛选同一基础名称下的所有版本命名 related_names = [name for name in existing_names if name.startswith(f"{base_name}_v")] # 提取所有版本号 versions = [] for name in related_names: v_match = version_pattern.match(name) if v_match: versions.append(int(v_match.group(2))) # 生成最新版本 max_v = max(versions) if versions else current_v return f"{base_name}_v{max_v + 1}" else: # 无版本后缀的情况 if target_name in existing_names: # 查找已有版本后缀的命名 related_names = [name for name in existing_names if name.startswith(f"{target_name}_v")] versions = [] for name in related_names: v_match = version_pattern.match(name) if v_match: versions.append(int(v_match.group(2))) max_v = max(versions) if versions else 1 return f"{target_name}_v{max_v + 1}" else: return target_name # 测试示例 existing_names = ['name_1'] print(generate_new_name(existing_names, 'name_1')) # 输出: name_1_v2 existing_names = ['name_1_v1'] print(generate_new_name(existing_names, 'name_1_v1')) # 输出: name_1_v2
结合Pandas使用
如果是处理DataFrame中的名称列,可以直接将函数应用到数据上:
df = pd.DataFrame({'existing_names': ['name_1', 'name_1_v1', 'test']}) # 生成新名称列 df['new_name'] = df['existing_names'].apply(lambda x: generate_new_name(df['existing_names'].tolist(), x))
为什么之前的正则失效?
你用的_v[0-9]$只能匹配结尾的版本后缀,但没有捕获前面的基础名称,无法实现版本号的替换逻辑,只能在原名称后直接追加新后缀,这就是出现name_1_v1_v1的原因。
内容的提问来源于stack exchange,提问作者Fernando Quintino
相关产品推荐
相关产品推荐

