2016-06-03 12 views
0

Ich schreibe eine Lösung für ein Problem, in dem ich die Befehlszeilenargumente analysieren muss. Vor dem Parsen habe ich zuerst die Validierung durchgeführt.Python3 regex Problem

Zulässige Argumente sind:

someKey=(apps IN (app1)) 
someKey=(apps IN (app1,app2)) 
someKey=(apps IN (app1,app2, app3)) 

Aber wenn Komma am Ende der letzten App-Name ist, dann möchte ich die Validierung fehlschlägt.

someKey=(apps IN (app1,app2,)) 

Ich schrieb die Regex wie folgt.

\(apps\sIN\s\((app\d|,)+\)\) 

Aber es nimmt sowohl gültige als auch ungültige Fälle. Ich habe einige Referenzen in Bezug auf Look-Ahead und Look-Up Lookup, aber es wurde nicht richtig implementiert. Kann jemand von euch mir helfen zu verstehen, was die Lösung für dieses Problem ist?

+0

Ich empfehle veeeeeeeeeeeeeryly stark, um solchen Code nicht selbst zu schreiben, aber zu verwenden https://docs.python.org/3/library/argparse.html – mnagel

+0

Nur ein FYI, dass die Gruppe '(app \ d |,)' (oder der in der Antwort von Keith Hall) wird nur das letzte Vorkommen dieser Gruppe erfassen, es werden keine separaten Gruppen für getrennte Einträge erstellt. –

+0

@mnagel arparse ist in Ordnung, um das 'somekey' Attribut korrekt zu lesen. Aber ob wir Validierung des "Wertes" mit dem Argeparse-Modul selbst durchführen können? – appu

Antwort

0

können Sie verwenden \(apps\sIN\s\((app\d+)(,\s*app\d+)*\)\)

Diese app\d+ besteht, dass mindestens ein Vorkommen von gewährleisten, und jedes nachfolgende Auftreten hat durch ein Komma (und optional Leerzeichen) vorangestellt werden.

Demo

Wenn Sie die App-Namen zu erfassen, können Sie verwenden:

\(apps\sIN\s\((app\d+)((?:,\s*(?:app\d+))*)\)\) 

und Sie werden die erste App-Name in Capture-Gruppe 1, und den Rest haben - einschließlich der Komma - in Capture-Gruppe 2, die dann durch das Komma getrennt werden müsste und die Leerzeichen strip ped off haben.

+0

Danke Keith. Aber es stimmte nicht überein, wenn der Wert mehr Ganzzahlen hat 'someKey = (apps IN (app12, app13))' – appu

+0

@appu, ich habe jetzt meine Antwort aktualisiert, sodass sie mit mehr Ganzzahlen übereinstimmt –

+0

Das hat den Trick gemacht. Danke Keith – appu