2017-11-02 14 views
1

Ich habe 2 reguläre Ausdrücke, 1, um verschachtelte Funktionen herauszuziehen (die dann in umgekehrter Reihenfolge ausgewertet werden), und ein anderes, um zu bestätigen, dass sie auf der weißen Liste sind, um Eval zu durchlaufen (Sobald ich hoffentlich das funktioniert, möchte ich XML speichern und Konfigurationsdaten, die analysiert und ausgewertet werden sollen).

Hier ist der Ausdruck, um die Funktionen und ihre Parameter zu greifen. Es funktionierte, bis ich das |^$ -Bit hinzufügte, aber ich will dieses Bit, also kann ich Funktionen unterstützen/whitelist, die keine Parameter nehmen.

func = re.compile(r"""([^\(]*) #first group stores function name 
    \(#starting parenthesis 
    \b([^\)\(\]\[\}\{]+)|^$\b #second group saves parameters passed to function 
    \) #closing parenthesis 
    """, re.VERBOSE) 

Hier ist die Whitelist Ausdruck. Es funktionierte auch, bis ich^$ hinzugefügt habe, um Funktionen ohne Parameter zu unterstützen.

Und ich bin (versucht), dies zu analysieren, was im Moment absichtlich Unsinn ist, aber nur um das Konzept zu beweisen. Die Absicht ist, die auf der weißen Liste stehenden Ausdrücke zu bewerten und in der Lage zu sein, Klammern zu verwenden, die für Mathematik verwendet werden.

print(float(addthese(int(((1)+(2)+aval())),1))) 
+1

Vielleicht möchten Sie eine optionale nicht-einfangende Gruppe verwenden können - https://regex101.com/r/6jXBaZ/2? –

+0

Ihr Kommentar hat mir den Rest des Weges gebracht, obwohl ich noch ein wenig über die Syntax von: Syntax forschen muss. Ich habe meine Whitelist nach der Aktualisierung der Funktion einfacher gemacht, jetzt ist es nur whitelist = re.compile (r "" "(?: \ Bint | float | print | addthese | aval \ b)?" "") –

+0

Wenn Sie Ihre hinzufügen Kommentar als Antwort Ich werde es markieren. Oh, und danke für die Verknüpfung von regex101.com, das ist ein ausgezeichnetes Dienstprogramm. –

Antwort

1

Sie benötigen eine optionale nicht-einfangende Gruppe:

([^\(]*) #first group stores function name 
\(#starting parenthesis 
(?: # optional non-capturing group start 
    \b([^\)\(\]\[\}\{]+)\b #second group saves parameters passed to function 
)? # optional non-capturing group end 
\) #closing parenthesis 

die regex demo See.

Die (?:...)? macht die gesamte \b([^\)\(\]\[\}\{]+)\b Musterfolge optional.

Hinweis overescaped Sie das Muster, Sie

([^(]*) #first group stores function name 
\(#starting parenthesis 
(?: # optional non-capturing group start 
    \b([^][(){}]+)\b #second group saves parameters passed to function 
)? # optional non-capturing group end 
\) #closing parenthesis 
+1

Danke für das Hinweis, dass ich Muster übersprungen habe. Ich lerne immer noch, wenn ich flüchten muss und wenn nicht, und die Illustration, die du zur Verfügung gestellt hast, ist sehr hilfreich. –