python - 如何仅替换第二次出现的 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
我该如何解决这个问题?感谢您的回答!
解决方案
捕获您需要保留的部分,并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
的值(-[а-яёА-ЯЁ,]+)
。