首页 > 解决方案 > 如何仅替换第二次出现的 re.search() 组

问题描述

如果需要,我需要用额外的零替换部分字符串值。

T-46-5-В,Г,6-В,Г ---> T-46-005-В,Г,006-В,Г 或 T-46-55-В,Г,56-В,Г ---> 例如 T-46-055-В,Г,066-В,Г

我有正则表达式模式^\D-\d{1,2}-([\d,]+)-[а-яА-я,]+,([\d,]+)-[а-яА-я,]+$,可以检索 2 个单独的字符串组,我必须更改。re.search().group()问题是如果在整个字符串中再次出现 my ,我无法用更改的值替换完全相同的组。

import re

my_string = "T-46-5-В,Г,6-В,Г"
my_pattern = r"^\D-\d{1,2}-([\d,]+)-[а-яА-я,]+,([\d,]+)-[а-яА-я,]+$"

new_string_parts = ["005", "006"]
new_string = re.sub(re.search(my_pattern, my_string).group(1), new_string_parts[0], my_string)
new_string = re.sub(re.search(my_pattern, my_string).group(2), new_string_parts[1], new_string)
print(new_string)

我得到而T-4006-005-В,Г,006-В,Г不是T-46-005-В,Г,006-В,Г因为. my_string我该如何解决这个问题?感谢您的回答!

标签: pythonregex

解决方案


捕获您需要保留的部分,并re.sub在替换部分中使用带有明确反向引用的单遍(因为它们与数字字符串变量混合):

import re

my_string = "T-46-5-В,Г,6-В,Г"
my_pattern = r"^(\D-\d{1,2}-)[\d,]+(-[а-яёА-ЯЁ,]+,)[\d,]+(-[а-яёА-ЯЁ,]+)$"

new_string_parts = ["005", "006"]
new_string = re.sub(my_pattern, fr"\g<1>{new_string_parts[0]}\g<2>{new_string_parts[1]}\3", my_string)
print(new_string)
# => T-46-005-В,Г,006-В,Г

请参阅Python 演示。注意我还添加ёЁ了俄语字母范围。

模式 - ^(\D-\d{1,2}-)[\d,]+(-[а-яёА-ЯЁ,]+,)[\d,]+(-[а-яёА-ЯЁ,]+)$- 现在在您不需要更改的部分周围包含括号,并且\g<1>指的是用 捕获的字符串(\D-\d{1,2}-)\g<2>指的是用(-[а-яёА-ЯЁ,]+,)和-to 捕获\3的值(-[а-яёА-ЯЁ,]+)


推荐阅读