Из кода очевидно, что шаблон регистра для замены создается из шаблона регистра соответствия путем его повторения (т. Е. StufF -> BanaNA
). Имея это в виду, я сначала найду шаблон регистра для всей строки, а затем приведу строку в нужный регистр:
def to_case(s, cmap):
'returns string cased according to map'
return ''.join([c.upper() if m else c for (c,m) in zip(s,cmap)])
input_str = "myStrIngFullOfStUfFiWannAReplaCE_StUfFs"
replace_str = "stuff"
replacer_str = "banana"
case_map = [c.istitle() for c in input_str] # initial case map
input_str_lower = input_str.lower()
while replace_str.lower() in input_str_lower: # Check if even in the string
ind = input_str_lower.find(replace_str) # find index
cases = [case_map[(ind + i % len(replace_str))] for i in range(len(replacer_str))] # replacement case pattern
case_map = case_map[:ind] + cases + case_map[ind + len(replace_str):]
input_str_lower = input_str_lower.replace(replace_str, replacer_str, 1)
print to_case(input_str_lower, case_map)
# prints: myStrIngFullOfBaNaNAiWannAReplaCE_BaNaNAs