String-Ersetzung durch regulären Python-Ausdruck

Ersetzen Sie mit der Unterfunktion des Re-Moduls.

Verwendung des Re-Moduls Referenz https://note.nkmk.me/python-re-match-search-findall-etc/

Programm

Das Verhalten des Programms ist wie folgt.

Die Werte von Antwort1, Antwort3 und Antwort4 werden wie folgt konvertiert. 1)  Wenn target_str und tmp_json sind: target_str = "asdasdasd ${key1} asdasdasdasd %key2% asdasdasd |key1| asdasdasd" tmp_json = {"key1" : "value1","key2" : "value2"} Der ersetzte Wert wird mit dem Wert neu geschrieben, der dem Schlüssel von tmp_json entspricht (siehe unten). asdasdasd value1 asdasdasdasd value2 asdasdasd value1 asdasdasd

Wenn target_str und tmp_json sind: target_str = "asdasdasd ${k1} asdasdasdasd %k2% asdasdasd |key1| asdasdasd" tmp_json = {"key1" : "value1","key2" : "value2"} Der ersetzte Wert wird mit dem Schlüssel tmp_json selbst wie unten gezeigt neu geschrieben. asdasdasd k1 asdasdasdasd k2 asdasdasd value1 asdasdasd

Wenn target_str und tmp_json sind: target_str = "asdasdasd $key1} asdasdasdasd key2% asdasdasd key1| asdasdasd" tmp_json = {"key1" : "value1","key2" : "value2"} Es stimmt nicht mit dem Muster des regulären Ausdrucks überein, daher entspricht es dem ursprünglichen Wert.

Der Wert von response2 wird unabhängig vom Wert von tmp_json mit dem Wert umgeschrieben, der dem regulären Ausdruck entspricht. Wenn es nicht übereinstimmt, entspricht es dem ursprünglichen Wert wie in 3.

#-*- encoding:utf-8 -*-
from functools import partial
import re

def call_back(match: re.match,tmp_dict=None) -> str:
    """
    call back
    Args:
        match: match object of re module
        tmp_dict: something dict object
    Returns:
        value
    """
    value = match.group("param")
    if tmp_dict != None and value in tmp_dict:
        return tmp_dict[value]
    return value

def search_and_convert(expression: str, tmp_json: dict) -> str:
    """
    Search specified string value, and replace it to the specified one
    Args:
        expression: would be converted string
        tmp_json: something dict value
    Returns:
        expression        
    """
    l = [
        {
            "reg" : re.finditer(r"(?<=\$\{)\w+(?=\})",expression),
            "prefix" : "${",
            "suffix" : "}"
        },
        {
            "reg" : re.finditer(r"(?<=%)\w+(?=%)",expression),
            "prefix" : "%",
            "suffix" : "%"
        },
        {
            "reg" : re.finditer(r"(?<=\|)\w+(?=\|)",expression),
            "prefix" : "|",
            "suffix" : "|"
        }
    ]
    for item in l:
        match_iterator = item["reg"]
        if match_iterator:
            for match in match_iterator:
                value = match.group()
                converted_value = value
                if value in tmp_json:
                    converted_value = tmp_json[value]
                expression = expression.replace(
                    item["prefix"] + value + item["suffix"],
                    converted_value
                )
    return expression


if __name__ == "__main__":
    target_str = "asdasdasd ${key1} asdasdasdasd %key2% asdasdasd |key1| asdasdasd"
    tmp_json = {"key1" : "value1","key2" : "value2"}

    #re.sub with lambda
    print(f"target_str = {target_str}")
    response1 = re.sub(r"\$\{(?P<param>\w+)\}",lambda x: tmp_json[x.group("param")] if x.group("param") in tmp_json else x.group("param"),target_str)
    response1 = re.sub(r"%(?P<param>\w+)%",lambda x: tmp_json[x.group("param")] if x.group("param") in tmp_json else x.group("param"),response1)
    response1 = re.sub(r"\|(?P<param>\w+)\|",lambda x: tmp_json[x.group("param")] if x.group("param") in tmp_json else x.group("param"),response1)
    print(f"response1 = {response1}")
    
    #re.sub with call back. 
    print(f"\033[33mtarget_str = {target_str}")
    response2 = re.sub(r"\$\{(?P<param>\w+)\}",call_back,target_str)
    response2 = re.sub(r"%(?P<param>\w+)%",call_back,response2)
    response2 = re.sub(r"\|(?P<param>\w+)\|",call_back,response2)
    print(f"response2 = {response2}\033[0m")

    #re.sub with call back which has a fixed augument.
    print(f"target_str = {target_str}")
    response3 = re.sub(r"\$\{(?P<param>\w+)\}",partial(call_back,tmp_dict=tmp_json),target_str)
    response3 = re.sub(r"%(?P<param>\w+)%",partial(call_back,tmp_dict=tmp_json),response3)
    response3 = re.sub(r"\|(?P<param>\w+)\|",partial(call_back,tmp_dict=tmp_json),response3)
    print(f"response3 = {response3}")

    #re.search & replace
    print(f"\033[33mtarget_str = {target_str}")
    response4 = search_and_convert(target_str,tmp_json)
    print(f"response4 = {response4}\033[0m")

    if response1 == response3 == response4:
        print("OK")
    else:
        raise Exception("Failed")

Recommended Posts

String-Ersetzung durch regulären Python-Ausdruck
Manipulation regulärer Ausdrücke durch Python
Kombinieren Sie sich wiederholende Zeichenfolgen mit regulären Python-Ausdrücken zu einer.
Bestimmen Sie, ob die Zeichenfolge Zeit mit einem regulären Python-Ausdruck ist
Regulärer Ausdruck im Pymongo
Python-Memo für reguläre Ausdrücke
Regulärer Ausdruck in Python
Python-Theorie regulärer Ausdruck Anmerkungen
String-Format mit Python% -Operator
Ändern Sie die zu ersetzende Zeichenfolge entsprechend der übereinstimmenden Zeichenfolge, indem Sie sie durch den regulären Python-Ausdruck ersetzen
Zerlegen Sie den Hostnamen mit co.jp mit regulärem Ausdruck
Python-String
Umgang mit regulären Ausdrücken durch PHP / Python
Holen Sie sich die passende Zeichenfolge in den regulären Ausdruck und verwenden Sie sie beim Ersetzen unter Python3 erneut
Start / End-Match im regulären Python-Ausdruck
(Python) Hinweise zum Lesen von HTML und zur Verwendung regulärer Ausdrücke
Ersetzen Sie Nicht-ASCII durch reguläre Ausdrücke in Python
Python: Vereinfachte morphologische Analyse mit regulären Ausdrücken
[Python] Eine Funktion, die die gesamte Zeichenfolge mit einem regulären Ausdruck durchsucht und alle übereinstimmenden Zeichenfolgen abruft.
Python: Strings kombinieren
FizzBuzz in Python3
Scraping mit Python
Python String Slice
Statistik mit Python
Scraping mit Python
Regulärer Ausdruck Gierig
Python mit Go
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
[Python] Reguläre Ausdrücke Reguläre Ausdrücke
mit Syntax (Python)
Überprüfung und Extraktion der URL-Übereinstimmung mit dem regulären Python-Ausdruck Regex Complete-Version
Bingo mit Python
Lösen mit Ruby, Perl, Java und Python AtCoder ABC 047 C Regulärer Ausdruck
Zundokokiyoshi mit Python
Python2-Zeichenfolgentyp
Python-String-Format
Python # String-Typ
Python-String-Inversion
Regulärer Ausdruck re
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
[Python] Werden Sie die Datierung mit regulären Ausdrücken los
Symbolischer Gruppenname für reguläre Ausdrücke in Python / Ruby
Entschlüsseln Sie eine unter iOS mit Python verschlüsselte Zeichenfolge
[Python] Ausdruck (1,2) macht kein Taple mit Klammern
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)