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>?