[Python] Ich habe eine Funktion erstellt, die auch reguläre Ausdrücke verwenden kann, die Zeichenfolgen auf einmal ersetzen.

Einführung

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.

Was wurde gemacht

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)

Wie benutzt man

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

[Python] Ich habe eine Funktion erstellt, die auch reguläre Ausdrücke verwenden kann, die Zeichenfolgen auf einmal ersetzen.
[Python R pyper] Kann ich pyper.R in einer Funktion verwenden? Lösungen
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
[Python] Eine Funktion, die die gesamte Zeichenfolge mit einem regulären Ausdruck durchsucht und alle übereinstimmenden Zeichenfolgen abruft.
Ich habe mit Python einen Zeichenzähler erstellt
[Python] Ich habe einen Dekorateur gemacht, der keinen Nutzen zu haben scheint.
[Python] Ich habe ein Dienstprogramm erstellt, das wie ein Pfad auf den Diktattyp zugreifen kann
Ich habe ein Modul PyNanaco erstellt, das Nanaco-Guthaben mit Python belasten kann
Ich habe ein Docker-Image erstellt, das FBX SDK Python von Node.js aus aufrufen kann
[auto-ohin] Einführung von auto-ohin, einem Befehlszeilenprogramm, das automatisch alle auf einmal stempeln kann [elektronischer Stempel]
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
[Python] Ich habe eine Funktion erstellt, die AES entschlüsselt und entschlüsselt, indem ich sie einfach mit pycrypto geworfen habe.
Ich habe ein Tool erstellt, um die Antwortlinks von OpenAI Gym auf einmal zu erhalten
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
Ich habe einen Python-Text gemacht
・ <Slack> Schreiben Sie eine Funktion, um Slack zu benachrichtigen, damit sie jederzeit in Anführungszeichen gesetzt werden kann (Python).
Verwenden Sie das Grafik-LCD als Zeichen-LCD, das auch chinesische Zeichen auf dem Rasberry Pi anzeigen kann
[Python] Ich habe einen Line-Bot erstellt, der zufällig nach englischen Wörtern fragt
[Python] Ich habe meine eigene Bibliothek erstellt, die dynamisch importiert werden kann
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ein Memo, das doppelte Anführungszeichen in voller Breite mit regulären Python-Ausdrücken verarbeitet
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Ich habe einen Line-Bot mit Python gemacht!
Ich kann mich nicht an reguläre Python-Ausdrücke erinnern
Ich habe mit Python eine Lotterie gemacht.
Ersetzen Sie alles auf einmal durch sed
Ich habe mit Python einen Daemon erstellt
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
Ich habe mir das Google-Labor notiert, das Spleeter problemlos verwenden kann.
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Funktionen von Modulen für reguläre Ausdrücke, die in Python häufig persönlich verwendet werden
Ich habe ein Tool erstellt, das die Dekomprimierung mit CLI (Python3) etwas erleichtert.
[IOS] Ich habe ein Widget erstellt, das den Trend von Qiita in Pythonista3 anzeigt. [Python]
[Python] Wann, wo, wer und welches Spiel mit regulären Ausdrücken
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.