2017-08-23 4 views
1

Einige Programmiersprachen bieten die Möglichkeit, einen Regex-Austausch dynamisch durchzuführen.Gibt es eine Möglichkeit, Regexes in Python dynamisch zu ersetzen?

Zum Beispiel, wir haben eine Zeichenfolge wie foo:$USER:$GROUP, wobei $USER und $GROUP durch ihre Umgebungsvariablen ersetzt werden. Die umgewandelte Zeichenfolge würde ungefähr wie foo:john:admin aussehen. Um dieses Problem zu lösen, müssen wir alle Zeichenketten nehmen, die \$[A-Za-z]+ entsprechen, und den Umgebungsvariablenwert nachschlagen.

In PHP, die folgenden sieht wie folgt aus:

<?php 
preg_replace_callback(
    # the regular expression to match the shell variables. 
    '/\$[A-Za-z]+/', 
    # Function that takes in the matched string and returns the environment 
    # variable value. 
    function($m) { 
    return getenv(substr($m[0], 1)); 
    }, 
    # The input string. 
    'foo:$USER:$GROUP' 
); 

eine ähnliche Sache in Python Gibt es?

+0

Ihre PHP-Code nicht korrekt ist, gibt es eine undefinierte '$ m'. Es muss "$ matches" sein –

+0

@ WiktorStribiżew ja, tippte das auf meinem Handy. Es ist jetzt behoben. – user2064000

+0

Müssen Sie das 'getenv (substr ($ m [0], 1)) 'Äquivalent in Python wissen? Oder wie man einen Callback in Python 're' verwendet? –

Antwort

1

Sie können re.sub mit einem Lambda-Ausdruck oder einer ähnlichen PHP-Callback-Methode verwenden.

import re, os 

s = 'foo:$USER:$GROUP' 
rx = r'\$([A-Za-z]+)' 
result = re.sub(rx, lambda m: os.getenv(m.group(1)), s) 
print(result) 

Das \$([A-Za-z]+) Muster paßt $ und dann fängt 1 oder mehr ASCII-Buchstaben in Gruppe 1. Im Innern des Lambda-Ausdruck, die m repräsentieren das Spiel Datenobjekt. Die USER oder GROUP ist innerhalb m.group(1).

1

Hallo user2064000,

Ja Python bietet viele eingebaute Funktion für reguläre Ausdrücke.

re.sub (Muster, repl, string, count = 0, flags = 0)

die Return Zeichenkette erhalten, indem die am weitesten links stehenden nicht überlappenden Vorkommen des Musters in Zeichenfolge durch den Ersatz repl ersetzen. Wenn das Muster nicht gefunden wird, wird die Zeichenfolge unverändert zurückgegeben. repl kann eine Zeichenfolge oder eine Funktion sein; Wenn es sich um eine Zeichenfolge handelt, werden alle Backslash-Escapes in ihm verarbeitet. Das heißt, \ n wird in ein einzelnes Zeilenumbruchzeichen umgewandelt, \ r wird in einen Wagenrücklauf konvertiert und so weiter. Unbekannte Escapes wie \ j bleiben in Ruhe. Backreferences wie \ 6 werden durch den Teilstring ersetzt, der im Pattern der Gruppe 6 entspricht.

Syntex

import re 
result = re.sub(pattern, callback, subject) 
result = re.sub(pattern, callback, subject, limit) 

Nützliche Links,
https://docs.python.org/2/library/re.html

Lösung

import re, os 

def replaceFunction(matchobj): 
    if matchobj.group(0) == "$USER": 
    return os.getenv(matchobj.group(1)) 
    elif matchobj.group(0) == "$GROUP": 
    return os.getenv(matchobj.group(1)) 

print re.sub(r'\$([A-Za-z]+)', replaceFunction, 'foo:$USER:$GROUP') 
+0

Hallo user2064000 Bitte überprüfen Sie meine Antwort .. wenn nützlich, so akzeptieren Sie meine Antwort ... –

Verwandte Themen