[Python] J'ai créé une fonction qui peut également utiliser des expressions régulières qui remplacent toutes les chaînes de caractères à la fois.

introduction

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.

Ce qui a été fait

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)

Comment utiliser

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

[Python] J'ai créé une fonction qui peut également utiliser des expressions régulières qui remplacent toutes les chaînes de caractères à la fois.
[Python R pyper] Puis-je utiliser pyper.R dans une fonction? Solution
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
[Python] Une fonction qui recherche la chaîne de caractères entière avec une expression régulière et obtient toutes les chaînes de caractères correspondantes.
J'ai fait un compteur de caractères avec Python
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
[Python] J'ai créé un utilitaire qui peut accéder au type dict comme un chemin
J'ai fait un module PyNanaco qui peut charger des crédits nanaco avec python
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
[auto-ohin] Présentation de auto-ohin, un outil de ligne de commande qui peut imprimer automatiquement tout à la fois [sceau électronique]
J'ai créé une VM qui exécute OpenCV pour Python
[Python] J'ai créé une fonction qui déchiffre et décrypte AES simplement en le lançant avec pycrypto.
J'ai créé un outil pour obtenir les liens de réponse d'OpenAI Gym en même temps
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
J'ai fait un texte Python
・ <Slack> Ecrire une fonction pour notifier Slack afin qu'elle puisse être citée à tout moment (Python)
Utilisez l'écran LCD graphique comme un écran LCD de caractères pouvant également afficher des caractères chinois sur le Rasberry Pi
[Python] J'ai créé ma propre bibliothèque qui peut être importée dynamiquement
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Un mémo qui gère les guillemets doubles pleine largeur avec les expressions régulières Python
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
J'ai fait un Line-bot avec Python!
Je ne me souviens pas des expressions régulières Python
J'ai fait une loterie avec Python.
Remplacez tout d'un coup par sed
J'ai créé un démon avec Python
J'ai créé une application Web en Python qui convertit Markdown en HTML
J'ai fait une note du colaboratoire Google qui peut utiliser Spleeter facilement.
J'ai créé un bot Discord en Python qui se traduit quand il réagit
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
Caractéristiques des modules d'expressions régulières qui sont souvent utilisés personnellement en Python
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
[IOS] J'ai créé un widget qui affiche la tendance de Qiita dans Pythonista3. [Python]
[Python] Quand, où, qui et quel jeu en utilisant des expressions régulières
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)