7
votes

Meilleure façon de faire une affaire de remplacement insensible mais correspond à l'affaire du mot à remplacer?

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?

Mon code: H2>
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


2 commentaires

Hey, le code ci-dessus ne fonctionnera pas pour "mystringfullofstuffiwannareplace_stuff" i.e quand les deux "trucs" ne sont pas identiques i.e Stuff et Stuff . La sortie est "mystringfullofbanAnaiwannareplace_stuff"


Si la chaîne à remplacer ( 'Stuff' ) et la chaîne de remplacement ( 'banane' ) ne pas avoir la même longueur Comment faire Vous envisagez de cartographier les lettres majuscules et inférieures? Ex: truc => banane ou => banane ?


3 Réponses :


3
votes

Vous pouvez passer flags = re.i à re.sub () pour ignorer-case xxx


0 commentaires

5
votes

J'utiliserais quelque chose comme ceci: xxx

exemple de sortie:

mystringfulofbanaNaiwannarePlace_Bananas

Notes:

  • Cela gère le cas dans lequel les différentes correspondances ont des combinaisons de majuscules / minuscules différentes.
  • Il est supposé que le modèle de remplacement est en minuscule (c'est très facile à changer, de toute façon).
  • Si le motif de remplacement est plus long que la correspondance, le même cas que dans le motif est utilisé.

0 commentaires

1
votes

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


0 commentaires