需求
背景
请教一个python正则表达式re的问题
我想用替换匹配到的第指定个字符
例如 原字符串 "++++"
可以匹配出4个"+"
我想将第3 第4个"+" 替换为"-"
re.sub只能定义 替换全部匹配字符 或者替换前几个字符 但是没办法替换指定索引位置的字符
参考思路
https://blog.csdn.net/u012063507/article/details/79271698
解决1
单个字符的替换
def sub_(string = '+a+b+c+d', pattern = '+', repl = '-', position = [2,3]):
list_pattern = []
for string_i, string_j in enumerate(string):
if string_j == pattern:
list_pattern.append(string_i)
for position_i in position:
string = string[:list_pattern[position_i]] + repl + string[list_pattern[position_i]+1:]
new_string = string
return new_string
解决2
多字节字符的替换
def sub_mul(string = '+a{}+b{}+c{}+d{}', pattern = '{}', repl = '[[]]', position = [2,3]):
'''获取长度'''
len_pattern = len(pattern)
len_repl = len(repl)
for position_i in position:
'''获取关键词位置(局限: 根据关键词词首匹配)'''
list_pattern = []
for string_i, string_j in enumerate(string):
if string_j == pattern[0]:
list_pattern.append(string_i)
# print(list_pattern)
'''插入关键词(不能直接删除关键词, 会影响position定位第几个元素'''
string_left = string[:list_pattern[position_i]]
# print(string_left)
string_right = string[list_pattern[position_i]:]
# print(string_right)
string = string_left + repl + string_right
# print(string, '\n')
# '''替换关键词(如果将该函数放在循环中 则在函数外部替换)'''
# new_string = string.replace(repl+pattern, repl)
return string
应用2
for l,m in enumerate(list_str):
form_ = sub_mul(string= form_, pattern= '{}', repl= m, position= [l]) # 注意 循环内部不要覆盖string
for l,m in enumerate(list_str):
form_ = form_.replace(m+'{}', '.'+m)
form_
解决3
多关键词依次替换
def sub_mul_loo(string = '+a{}+b{}+c{}+d{}', pattern = '{}', list_str = ['[]', '([])','{([])}'], str_add = ''):
for list_i, list_j in enumerate(list_str):
repl = list_j
position = list_i
'''获取关键词位置(局限: 根据关键词词首匹配)'''
list_pattern = []
for string_i, string_j in enumerate(string):
if string_j == pattern[0]:
list_pattern.append(string_i)
'''插入关键词(不能直接删除关键词, 会影响position定位第几个元素'''
string_left = string[:list_pattern[position]]
string_right = string[list_pattern[position]:]
string = string_left + repl + string_right
'''循环结束后替换'''
for list_i, list_j in enumerate(list_str):
string = string.replace(list_j + pattern, str_add + list_j)
return string
应用3
form_ = sub_mul_loo(string= form_, pattern= '{}', list_str= list_str, str_add= '.')