Lors du remplacement d'une chaîne de caractères par plusieurs modèles, il s'agit généralement d'un code redondant comme ↓.
#Par exemple
# " <-> '
# abc...z -> *
# ABC...Z -> AA, BB, CC, ...,ZZ
#Si vous souhaitez remplacer comme
text = "'abc'" + '"ABC"'
#modèle 1
replaced_text = text.replace('"', '#').replace("'", '"').replace('#', "'").replace("a", "*"). .......
#Motif 2
trdict = str.maketrans({'"': "'", "'": '"', "a": "*", "b": "*", .......})
replaces_text = text.translate(trdict)
#Modèle 3
import re
replaced_text = re.sub("#", '"', re.sub('"', "'", re.sub("'", '#', re.sub("[a-z], "*", re.sub("[A-Z]", "\\1\\1", text)))))
#etc...
De plus, dans le cas de méthodes de remplacement telles que les motifs 1 et 3, puisque le remplacement est effectué dans l'ordre, il est nécessaire de considérer la possibilité d'un remplacement inattendu tel qu'un remplacement supplémentaire des caractères après remplacement. .. Cependant, si vous ne pouvez pas utiliser d'expressions régulières comme dans le modèle 3, cela prendra beaucoup de temps et d'efforts.
Pour éliminer une telle insatisfaction
** Vous pouvez également utiliser des expressions régulières, Vous pouvez transmettre les modèles de remplacement ensemble dans un dictionnaire, Tous les remplacements peuvent être effectués en même temps **
J'ai écrit une fonction.
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)
Premier argument: chaîne de caractères d'origine
Deuxième argument: dictionnaire de remplacement {before: after}
Valeur de retour: Chaîne de caractères après remplacement
text = "'abc'" + '"ABC"'
trdict = {"'": '"', '"': "'", "[a-z]": "*", "([A-Z])": "\\1\\1"}
replaces(text, trdict)
# ---> "***"'AABBCC'
Si plusieurs modèles du dictionnaire correspondent, le modèle précédent est prioritaire.
Recommended Posts