2017-03-08 6 views
3

Es ist mein erster Tag mit regulären Ausdrücken. Ich brauche Hilfe bei der Formulierung. Gemäß der Spezifikation ist die Menge der sicheren Zeichen für etwas anderes als ein Domain-Namen wie folgt: sind A-Z a-z 0-9 - . _ ~ () ' ! * : @ , ; + ?Regex für sichere Zeichen

Und tatsächlich + und ? nur sicher, wenn sie innerhalb einer URL verwendet wird, nicht ganz anders.

Wie drücke ich die obigen Zeichen als regulären Ausdruck aus (d. H. Nur diese Zeichen sind erlaubt, alle anderen ausgeschlossen).

Ich hatte einen Versuch bei regexr.com. Bisher habe ich ([A-Z,a-z,0-9,+-])\w+. durch Versuch und Irrtum gebaut, was unzureichend ist. Kann mir hier jemand helfen, den richtigen Regex zu formulieren? Btw verwende ich Python 2,7

+2

Was ist das Muster, das Sie übereinstimmen möchten? – putonspectacles

Antwort

2
r"^[A-Za-z0-9._~()'!*:@,;+?-]*$" 

Dies wird nur Zeichenfolgen übereinstimmen, die der sicheren Zeichen bestehen.

+0

es entspricht auch leere Zeichenfolge, wahrscheinlich sollte nicht (einfach zu reparieren!) –

+0

Das hängt wirklich vom Anwendungsfall ab. Die leere Zeichenfolge enthält keine unsicheren Zeichen, daher könnte es sinnvoll sein, sie anzupassen. Ersetzen Sie das * natürlich mit + falls gewünscht. – Denziloe

+1

natürlich, ich weiß du weißt :) –

2

Sie könnten die Verwendung von Regex vermeiden, um einzelne Zeichen in einer Zeichenfolge zu testen.

x and all(x.isalnum() or x in "._~()'!*:@,;+?-" for x in s) 
  • Prüfung, ob x nicht leer ist (leere Strings sind nicht gültig Urls)
  • Prüfung isalnum() erste, weil es:

    I all mit str.isalnum oder beim Check gegen erlaubt nicht-alphanums verwenden würde, sind wahrscheinlich mehr Buchstaben als Symbole und somit wäre es etwas schneller)