Wenn Sie eine Zeichenfolge durch mehrere Muster ersetzen, handelt es sich in der Regel um redundanten Code wie ↓.
#Zum Beispiel
# " <-> '
# abc...z -> *
# ABC...Z -> AA, BB, CC, ...,ZZ
#Wenn Sie gerne ersetzen möchten
text = "'abc'" + '"ABC"'
#Muster 1
replaced_text = text.replace('"', '#').replace("'", '"').replace('#', "'").replace("a", "*"). .......
#Muster 2
trdict = str.maketrans({'"': "'", "'": '"', "a": "*", "b": "*", .......})
replaces_text = text.translate(trdict)
#Muster 3
import re
replaced_text = re.sub("#", '"', re.sub('"', "'", re.sub("'", '#', re.sub("[a-z], "*", re.sub("[A-Z]", "\\1\\1", text)))))
#etc...
Darüber hinaus wird bei Ersetzungsverfahren wie den Mustern 1 und 3 das Ersetzen in der richtigen Reihenfolge durchgeführt, so dass die Möglichkeit eines unerwarteten Ersetzens wie eines weiteren Ersetzens der Zeichen nach dem Ersetzen in Betracht gezogen werden muss. .. Wenn Sie jedoch keine regulären Ausdrücke wie in Muster 3 verwenden können, ist viel Zeit und Mühe erforderlich.
Um solche Unzufriedenheit zu beseitigen
** Sie können auch reguläre Ausdrücke verwenden. Sie können die Ersatzmuster zusammen in einem Wörterbuch übergeben. Alle Ersetzungen können gleichzeitig erfolgen **
Ich habe eine Funktion geschrieben.
import re
from typing import Dict
def replaces(text: str, trdict: Dict[str, str]) -> str:
"""
IN:
Source text
Replacement dictionary
OUT:
Replaced text
NOTE:
You can use regular expressions.
If more than one pattern is matched,
the pattern closest to the front of the dictionary takes precedence.
EXAMPLE:
text = "'abc'" + '"ABC"'
replaces(text, {"'": '"', '"': "'", "[a-z]": "*", "([A-Z])": "\\1\\1"})
---> "***"'AABBCC'
"""
return re.sub(
"|".join(trdict.keys()), lambda m: next(
(re.sub(pattern, trdict[pattern], m.group(0)) for pattern in trdict
if re.fullmatch(pattern, m.group(0)))), text)
Erstes Argument: Originalzeichenfolge
Zweites Argument: Ersatzwörterbuch {before: after}
Rückgabewert: Zeichenfolge nach dem Ersetzen
text = "'abc'" + '"ABC"'
trdict = {"'": '"', '"': "'", "[a-z]": "*", "([A-Z])": "\\1\\1"}
replaces(text, trdict)
# ---> "***"'AABBCC'
Wenn mehrere Muster im Wörterbuch übereinstimmen, hat das vorherige Muster Vorrang.
Recommended Posts