Remplacement de chaîne par une expression régulière Python

Remplacez en utilisant la sous-fonction du module re.

Comment utiliser le module re Référence https://note.nkmk.me/python-re-match-search-findall-etc/

programme

Le comportement du programme est le suivant.

Les valeurs de response1, response3 et response4 sont converties comme suit. 1)  Si target_str et tmp_json sont: target_str = "asdasdasd ${key1} asdasdasdasd %key2% asdasdasd |key1| asdasdasd" tmp_json = {"key1" : "value1","key2" : "value2"} La valeur remplacée sera réécrite avec la valeur correspondant à la clé de tmp_json comme indiqué ci-dessous. asdasdasd value1 asdasdasdasd value2 asdasdasd value1 asdasdasd

Si target_str et tmp_json sont: target_str = "asdasdasd ${k1} asdasdasdasd %k2% asdasdasd |key1| asdasdasd" tmp_json = {"key1" : "value1","key2" : "value2"} La valeur remplacée peut être réécrite avec la clé tmp_json elle-même comme indiqué ci-dessous. asdasdasd k1 asdasdasdasd k2 asdasdasd value1 asdasdasd

Si target_str et tmp_json sont: target_str = "asdasdasd $key1} asdasdasdasd key2% asdasdasd key1| asdasdasd" tmp_json = {"key1" : "value1","key2" : "value2"} Il ne correspond pas au modèle d'expression régulière, il est donc identique à la valeur d'origine.

La valeur de response2 est réécrite avec la valeur qui correspond à l'expression régulière, quelle que soit la valeur de tmp_json. Si elle ne correspond pas, elle sera la même que la valeur d'origine comme en 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

Remplacement de chaîne par une expression régulière Python
Manipulation d'expressions régulières par Python
Combinez des chaînes répétitives en une seule avec des expressions régulières Python.
Déterminer si la chaîne est l'heure avec une expression régulière python
Expression régulière en pymongo
mémo d'expression régulière python
Expression régulière en Python
Notes sur l'expression régulière de la théorie Python
Format de chaîne avec l'opérateur Python%
Modifiez la chaîne de caractères à remplacer en fonction de la chaîne de caractères correspondante en la remplaçant par l'expression régulière Python
Décomposer le nom d'hôte avec co.jp avec une expression régulière
Chaîne Python
Gestion des expressions régulières par PHP / Python
Récupérez la chaîne correspondante dans l'expression régulière et réutilisez-la lors du remplacement sur Python3
Match de début / fin dans l'expression régulière python
(Python) Remarques sur la lecture de HTML et l'utilisation d'expressions régulières
Remplacer non-ASCII par des expressions régulières en Python
Python: analyse morphologique simplifiée avec des expressions régulières
[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.
Python: combinaison de chaînes
FizzBuzz en Python3
Grattage avec Python
tranche de chaîne python
Statistiques avec python
Grattage avec Python
Expression régulière gourmande
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
[Python] Expressions régulières Expressions régulières
avec syntaxe (Python)
Vérification et extraction de correspondance d'URL avec l'expression régulière Python Regex Version complète
Bingo avec python
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 047 C Expression régulière
Zundokokiyoshi avec python
Type de chaîne Python2
Format de chaîne Python
Python # type de chaîne
Inversion de chaîne Python
Expression régulière re
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
[Python] Débarrassez-vous de la datation avec des expressions régulières
Nom de groupe symbolique d'expression régulière en Python / Ruby
Décrypter une chaîne chiffrée sur iOS avec Python
[Python] Expression (1,2) ne fait pas de taple avec des parenthèses
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)