Nehmen wir an, wir haben die folgende Reihe von URIs:

A: / user / a / b / c

B: / user / a / b / f / d

C: / user / a / b / e

D: / user / a / k / r

Ich benötige einen regulären Ausdruck in Python, der mit allen Regeln außer Regel B übereinstimmt. Daher sollte er mit allen URIs übereinstimmen, die mit / user / a beginnen, aber die URIs ausschließen, die mit d .

Vielen Dank im Voraus!

Update: Die Segmente der Pfade bestehen nicht aus einzelnen Zeichen, sondern aus ganzen Wörtern. Zum Beispiel kann d "senden" sein.

2
Thanos Makris 9 Okt. 2012 im 19:04

4 Antworten

Beste Antwort

Basierend auf der Antwort von Jiman lautet die genaue Lösung meiner Frage wie folgt:

(?!.*d)\/user/a/.*

Beachten Sie, dass d und a ganzen Wörtern entsprechen. Ein Beispiel wäre also:

(?!.*send)\/user/myapp/.*
1
Thanos Makris 9 Okt. 2012 im 15:34

Probieren Sie es aus:

(?!.*\/d)\/user\/a.*

(?!. * / d) -> negative Vorausschau-Behauptung, die im Grunde sagt, dass sie nicht mit / d endet

Bringe einem Mann das Fischen bei:

http://rubular.com/

Geben Sie die Testzeichenfolgen ein und spielen Sie mit den regulären Ausdrücken herum :)

1
Jiman 9 Okt. 2012 im 15:37

Wie wäre es mit so etwas wie:

^/user/a/.*[^d]$

Lesen Sie es als "Beginnen Sie mit / user / a /, dann mit einer beliebigen Anzahl anderer Zeichen und dann mit einem Endzeichen, das kein d sein darf.

3
hwjp 9 Okt. 2012 im 15:09

Wahrscheinlich nur klarer zu bedienen:

a = '/user/a/b/f/d'
b = s.strip('/').split('/')
if b[:2] == ['user', 'a'] and b[-1] != 'd':
    pass # whatever

Oder wenn Sie nicht nach / teilen, dann:

if a.startswith('/user/a') and not a.endswith('d'):
    pass # whatever
0
Jon Clements 9 Okt. 2012 im 15:13