Jusqu'à présent, j'ai monté la méthode ci-dessous, mais ma question est là une méthode plus courte qui présente le même résultat?
input_str = "myStrIngFullOfStUfFiWannAReplaCE_StUfFs"
replace_str = "stuff"
replacer_str = "banana"
print input_str
# prints: myStrIngFullOfStUfFiWannAReplaCE_StUfFs
if replace_str.lower() in input_str.lower(): # Check if even in the string
begin_index = input_str.lower().find( replace_str )
end_index = begin_index + len( replace_str )
replace_section = input_str[ begin_index : end_index ]
case_list = []
for char in replace_section: # Get cases of characters in the section to be replaced
case_list.append( char.istitle() )
while len( replacer_str ) > len(case_list):
case_list += case_list
sameCase_replacer_str = "" # Set match the replacer string's case to the replace
replacer_str = replacer_str.lower()
for index in range( len(replacer_str) ):
char = replacer_str[ index ]
case = case_list[ index ]
if case == True:
char = char.title()
sameCase_replacer_str += char
input_str = input_str.replace( replace_section , sameCase_replacer_str )
print input_str
# prints: myStrIngFullOfBaNaNAiWannAReplaCE_BaNaNAs
3 Réponses :
Vous pouvez passer flags = re.i code> à re.sub () code> pour ignorer-case
J'utiliserais quelque chose comme ceci: exemple de sortie: p> mystringfulofbanaNaiwannarePlace_Bananas p>
blockQuote> Notes: P>
Du code, il est évident que le motif de cas pour le remplacement est effectué à partir du modèle de cas de correspondance en le répétant sur (SO Stuff -> banane code>). Gardant cela à l'esprit, je trouverais d'abord un motif de cas pour la chaîne entière, puis apporter la chaîne à l'affaire souhaitée: 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
Hey, le code ci-dessus ne fonctionnera pas pour
"mystringfullofstuffiwannareplace_stuff" code> i.e quand les deux "trucs" ne sont pas identiques i.e Stuff B> et Stuff b>. La sortie est"mystringfullofbanAnaiwannareplace_stuff" code>Si la chaîne à remplacer (
'Stuff' code>) et la chaîne de remplacement ('banane' code>) ne pas avoir la même longueur b> Comment faire Vous envisagez de cartographier les lettres majuscules et inférieures? Ex:truc => banane code> ou=> banane code>?