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

如何使用Python正则表达式递增以-FT(数字)结尾的参考编号

解决以-FT(数字)结尾的参考编号识别与递增问题

首先看你的核心问题:现有正则无法匹配类似CHB-16236-FT-FT045这种格式的参考编号,同时需要将结尾的FT045精准递增为FT046。咱们一步步来修正代码:

1. 修正正则匹配模式

你的原pattern_chambre限定了CHB-数字-两位字母-数字的固定结构,但目标编号多了一个中间的-FT分段,所以需要调整正则来适配任意中间分隔段,最终以-FT+数字结尾的格式:

pattern_chambre = r"^CHB-\d+-(?:[A-Z]+-)*FT(\d+)$"

正则解释:

  • ^CHB-\d+:强制以CHB开头,后跟数字分段
  • (?:[A-Z]+-)*:匹配任意数量的大写字母分段(比如FT-),?:表示非捕获组,避免生成多余的匹配结果
  • FT(\d+)$:精准匹配结尾的FT加数字,并用括号捕获数字部分,方便后续递增操作

如果需要严格匹配CHB-xxxx-FT-FTxxx这种固定双层FT的格式,也可以写成更限定的版本:

pattern_chambre = r"^CHB-\d+-FT-FT(\d+)$"

2. 优化编号递增逻辑

原increment_ref里的替换正则r'[^-]+[0-9]$'存在误匹配风险,咱们直接基于正则捕获的数字组来替换,逻辑更精准可靠:

def increment_ref(pattern, sample_str):
    """
    @param: regex pattern, sample string
    return : increment reference by 1, or None if invalid
    """
    sample_str = str(sample_str)
    match = re.match(pattern, sample_str)
    if match:
        old_references.append(sample_str)
        # 获取捕获的数字部分,保持原有的位数补零(比如045→046,而非46)
        num_part = match.group(1)
        new_num = str(int(num_part) + 1).zfill(len(num_part))
        # 替换原结尾的数字段
        new_ref = re.sub(r'FT\d+$', f'FT{new_num}', sample_str)
        new_references.append(new_ref)
        return new_ref
    else:
        invalid_references.append(sample_str)
        return None

3. 完整可运行代码

整合修改后的代码,测试效果:

import re
pattern_poteaux = r"(POT|PHT)+[-]+[0-9]{5}[-]+[a-zA-Z]{2}[-]+\d+$"
# 修正后的chambre正则
pattern_chambre = r"^CHB-\d+-(?:[A-Z]+-)*FT(\d+)$"
old_references = []
new_references = []
invalid_references = []

def attribute_check(pattern, sample_str):
    """
    @param: regex pattern, sample string
    return : True if string match regex pattern, False if not.
    """
    sample_str = str(sample_str)
    return re.match(pattern, sample_str) is not None

def increment_ref(pattern, sample_str):
    """
    @param: regex pattern, sample string
    return : increment reference by 1, or None if invalid
    """
    sample_str = str(sample_str)
    match = re.match(pattern, sample_str)
    if match:
        old_references.append(sample_str)
        num_part = match.group(1)
        new_num = str(int(num_part) + 1).zfill(len(num_part))
        new_ref = re.sub(r'FT\d+$', f'FT{new_num}', sample_str)
        new_references.append(new_ref)
        return new_ref
    else:
        invalid_references.append(sample_str)
        return None

if __name__ == "__main__":
    reference_chamber = 'CHB-16236-FT-FT045'
    new_ref = increment_ref(pattern_chambre, reference_chamber)
    print(f"原编号: {reference_chamber}")
    print(f"新编号: {new_ref}")
    # 输出结果:
    # 原编号: CHB-16236-FT-FT045
    # 新编号: CHB-16236-FT-FT046

关键优化点

  • 正则添加^和$锚点,确保匹配整个字符串,避免部分匹配导致的错误
  • 用捕获组精准定位结尾数字,递增时保留原位数的补零规则
  • 补充了new_references列表的写入逻辑,完善了编号的记录功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:57:35