2017-06-10 3 views
0

Ich schrieb eine Python-Regex, um URLs zu entsprechen. Ich habe ein ziemlich komplexes geschrieben, das ziemlich gut funktioniert. Ich habe versucht, den Etikettenteil im Hostnamen zu erhalten, um genauer zu sein, basierend auf dem, was ich auf Wikipedia gelesen habe.Kann nicht diese 'URL-Label' Regex, um genau zu sein

Grundsätzlich, wenn Sie mein Code-Snippet sehen, habe ich eine Wahrheitstabelle, um den Etikettenteil zu testen, den ich geschrieben habe. Wenn du die Wahrheitstabelle verstehen willst, basiert sie auf 'Einschränkungen für Hostnamen' in der Wiki-Seite des Hostnamens.

Ich kann Fall 1 (Zeichenfolgen [0]) einfach nicht erreichen, ohne andere Fälle zu brechen und kann nicht herausfinden, warum Fall 1 nicht funktionieren würde. Ich habe Debugging-Tools verwendet, aber die betreffende Fehler-Zeichenfolge ist zu klein, um wichtige Informationen zu erhalten.

Bitte helfen Sie mir und geben Sie mir eine Antwort auf die, die ich geschrieben habe, damit ich weiß, was ich vermisse.

Wenn Sie sich fragen, warum ich nicht eine Drittanbieter-Bibliothek verwenden, um URLs zu entsprechen, lerne ich reguläre Ausdrücke.

import re 

F = False 
T = True 

results = [T,F,T,F,F,F,T,F,T,F,F,F,F,F] 

strings = ['a','-','aa','--','-a','a-','aaa','aa-','a-a','a--','-aa','-a-','--a','---'] 

x = list(range(len(strings))) 

regex_test = r'(?P<Label>(?P<Label_start>[a-zA-Z0-9])((?P<Label_mid>[a-zA-Z0-9-]{1,61})?)(?=(?P<Label_end>[a-zA-Z0-9](?=[./])))(?P=Label_end)?)\.' 

if len(strings) == len(results): 
    for n in x: 
     if results[n] == bool(re.match(pattern = regex_test, string = strings[n] + '.')): 
      print("Works.") 
      if results[n] == True: 
       print(re.match(pattern = regex_test, string = strings[n] + '.').groupdict()) 
     else: 
      print("Bug for: " + strings[n]) 
      #print(str(re.match(pattern = regex_test, string = strings[n] + '.',flags=re.DEBUG))) 
+0

Mögliche Duplikat [Domain Name Validierung mit RegEx] (https://stackoverflow.com/questions/10306690/domain-name-validation-with-regex) –

+0

Meine regex ist fast genau. Bitte zeigen Sie, warum die Regex nicht mit einem einzelnen Zeichen übereinstimmt. Das würde mir helfen zu verstehen, wo ich in meiner Regex falsch gelaufen bin. Würde es sehr zu schätzen wissen. Außerdem brauche ich nur Hilfe mit dem Label nicht den Hostnamen. Das '.' wird als End-Flag verwendet, da auf diese Regex der Rest des Host-Namens regex folgt und dann der Rest der URL-Regex. –

+0

Ich würde versuchen, mit Ihrer Regex auf etwas wie regex101.com zu spielen. Versuchen Sie auch, die Syntax zu vereinfachen (eliminieren Sie die benannten Gruppen), um Ihren Fehler zu finden. Sie können sie später wieder hinzufügen. –

Antwort

0

Manchmal ist es einfacher (und lesbarer) einfach Python zu verwenden! Es gibt jedoch einen Teil der Validierung des Domänennamens, der von re profitiert. Sehen Sie meinen Versuch here, oder mein vollständiges snipett unten.

# What are valid hostnames? 
# (1) Series of labels separated by periods. 
# (2) Each label can contain only letters, numbers and hyphens. 
# (3) Each label can not start or end with a hyphen. 
# (4) Each label can be 1-63 characters 
# (5) Entire domain cannot be longer than 253 characters. 

import re 

domains = ['en.wikipedia.org', 
      'my.his-site.com', 
      '-bad.site-.5345'] 

def is_valid_hostname(domain): 
    # Utilize rule 1 to split into labels. 
    labels = domain.split('.') 

    for label in labels: 
     # Check rules 2 and 3. 
     if not re.search(r'^[A-z0-9][A-z0-9\-]*[A-z0-9]$', label): 
      return False 

     # Check rule 4. 
     if not (0 < len(label) < 64): 
      return False 

    # Check rule 5. 
    if len(domain) > 253: 
     return False 

    return True 


for domain in domains: 
    if is_valid_hostname(domain): 
     print('{}:\tvalid'.format(domain)) 
    else: 
     print('{}:\tinvalid'.format(domain)) 
+0

Dies wird ein Teil eines viel größeren Regex sein. Ich brauche das nur als regulären Ausdruck. Auch die Länge des Domainnamens spielt im Moment keine Rolle. Aber danke, dass du die Auszeit genommen hast und mein Problem verstanden hast. –

+0

Sie wollen also eine Regex-Lösung? In diesem Fall gilt:^^ [0-9 \ p {L}] [0-9 \ p {L} - \.] {1,61} [0-9 \ p {L}] \. [0-9 \ p {L}] [\ p {L} -] * [0-9 \ p {L}] + $ 'würde den Job erledigen (siehe https://stackoverflow.com/a/38477788/1713185) –

Verwandte Themen