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

