am nächsten ist wahrscheinlich:
somere.sub(lambda m: replacements[m.group()], text)
zum Beispiel:
>>> za = re.compile('z\w')
>>> za.sub(lambda m: dict(za='BLU', zo='BLA')[m.group()], 'fa za zo bu')
'fa BLU BLA bu'
mit einem .get
statt []
-indexing, wenn Sie einen Standard für Spiele liefern mögen, die in replacements
fehlen.
Edit: was Rick wirklich will, ist ein Diktat mit Schlüsseln zu haben als reguläre Ausdruck Muster, wie '\d+S'
, und (hoffentlich) konstante String-Werte (hoffentlich w/o Rückschlüsse) genommen werden. Das Kochbuch Rezept kann für diesen Zweck angepasst werden:
def dict_sub(d, text):
""" Replace in 'text' non-overlapping occurences of REs whose patterns are keys
in dictionary 'd' by corresponding values (which must be constant strings: may
have named backreferences but not numeric ones). The keys must not contain
anonymous matching-groups.
Returns the new string."""
# Create a regular expression from the dictionary keys
regex = re.compile("|".join("(%s)" % k for k in d))
# Facilitate lookup from group number to value
lookup = dict((i+1, v) for i, v in enumerate(d.itervalues()))
# For each match, find which group matched and expand its value
return regex.sub(lambda mo: mo.expand(lookup[mo.lastindex]), text)
Beispiel für die Verwendung:
d={'\d+S': 'wot', '\d+T': 'zap'}
t='And 23S, and 45T, and 66T but always 029S!'
print dict_sub(d, t)
aussendet:
And wot, and zap, and zap but always wot!
Sie vermeiden lookup
bauen könnte und nur mo.expand(d.values()[mo.lastindex-1])
verwenden, aber das könnte sein ein bisschen langsam, wenn d
ist sehr groß und es gibt viele Übereinstimmungen (Sorry, habe nicht beide Ansätze genau gemessen/bewertet, so ist dies nur eine Vermutung;-).
sein Dieser unterstützt nur einen regulären Ausdruck, ich glaube, Sie können Gehen Sie nicht einfacher als die Funktion, die ich von ActiveState übernommen habe, für den Fall, dass Sie sowohl ein Ersatz- als auch ein Muster-Diktat wünschen. Können Sie? –
Für mehr String-Ersetzungen in einem Durchgang durchgeführt wird, wie ich das Rezept, das ist, warum ich es für das Python-Kochbuch aufgenommen, siehe http://books.google.com/books?id=Q0s6Vgb98CQC&pg=PA38&dq=xavier+defrang&ei=k5okSvPbNILClQSk2LWvBw (Ich denke, dass die Diskussion, die Anna und ich dort hinzufügten, einen gewissen Mehrwert bringt, aber ich bin natürlich voreingenommen. Ich habe versucht, direkter auf die genaue Frage zu antworten - eine ganz allgemeine RE und ein gegebenes Ersatzdiktat. –
Ich denke, die ursprüngliche Frage wird besser durch das Rezept beantwortet, weil PHP preg_replace sowohl viele Regexps und Ersetzungen akzeptiert. –