Wat is de aanbevolen manier om meerdere strings in één grote string in Python te vervangen?

Ik heb veel stringparen en één grote reeks (wat de inhoud van een bestand is). Ik moet elk voorkomen van het eerste lid in elk paar vervangen door het respectievelijke tweede lid.

Als u bijvoorbeeld paren ("AA", "BB") en ("qq", "rt") heeft, moet ik elk voorkomen van AA vervangen door BB en van qq met rt .

De strings in de paren zijn allemaal uniek, dus de volgorde van de vervangingen doet er niet toe op het eindresultaat.

Mijn python-code is de meest naïef - ik pas de methode string.replace successievelijk toe totdat alle paren zijn uitgeput:

>>> s="frsfsdAAsdfvsdfvqqdsff"
>>> pairs=[('AA', 'BB'), ('qq', 'rt')]
>>> for p in pairs:
...   s=s.replace(p[0], p[1])
...
>>> s
'frsfsdBBsdfvsdfvrtdsff'
>>>

Ik geloof dat dit een slechte oplossing is voor grote reeksen. Kan iemand een efficiëntere voorstellen?

De vraag gaat over hoe u dit in Python moet doen.

Bedankt.

4

1 antwoord

Er is iets anders mis met uw voorgestelde oplossing: na de eerste vervanging kan de resulterende reeks overeenkomen en dezelfde tekens kunnen opnieuw worden vervangen. Uw oplossing zou bijvoorbeeld niet het gewenste resultaat geven als u 'qq' en 'ff' wilde uitwisselen door paren = [('qq', ' ff '), (' ff ',' qq ')] .

Je zou dit in plaats daarvan kunnen proberen:

>>> d = dict(pairs)
>>> import re
>>> pattern = re.compile('|'.join(re.escape(k) for k in d))
>>> pattern.sub(lambda k:d[k.group()], s))
frsfsdBBsdfvsdfvrtdsff
3
toegevoegd
Oh, maar ik heb expliciet in de vraag gesteld en ik citeer: De strings in de paren zijn allemaal uniek, dus de volgorde van vervangingen doet er niet toe op het eindresultaat. Zelfs als het bestelgedeelte niet relevant is , de preconditie geldt nog steeds - alle snaren zijn uniek.
toegevoegd de auteur mark, de bron
Waarom is dat? string.replace vervangt alle occurrences - 'mmmAAmmmmAAmmmAA'.replace (' AA ',' BB ') ==' mmmBBmmmmBBmmmBB ' is True
toegevoegd de auteur mark, de bron
Ik denk dat ik het nu snap, de combinatie van vervangende tekenreeks met de andere tekens kan nieuwe overeenkomsten opleveren, die dan worden vervangen. Goede vangst, bedankt.
toegevoegd de auteur mark, de bron
@mark: Dat maakt helemaal geen verschil. Uw oplossing werkt nog steeds niet . Ik zou gemakkelijk een ander voorbeeld kunnen vinden waarbij alle reeksen uniek zijn maar uw oplossing zal mislukken om het verwachte resultaat te geven.
toegevoegd de auteur Mark Byers, de bron