2015-07-06 6 views
5

Ich habe ein Selen/Python-Projekt, das eine Regex-Übereinstimmung verwendet, um HTML-Elemente zu finden. Diese Elementattribute enthalten manchmal die dänischen/norwegischen Zeichen ÆØÅ. Das Problem ist in diesem Snippet unten:Python Regex-Abgleich schlägt mit UTF-8-Zeichen fehl

if (re.match(regexp_expression, compare_string)): 
    result = True 
else : 
    result = False 

Sowohl die regex_expression und compare_string manipuliert werden, bevor die Regex ausgeführt wird. Wenn ich sie vor dem Code-Schnipsel drucken oben ausgeführt wird, und auch das Ergebnis drucken, erhalte ich die folgende Ausgabe:

Regex_expression: [^log på$] 
compare string: [log på] 
result = false 

Ich habe Klammern auf sicherstellen, dass es keine Leerzeichen waren. Sie sind nur ein Teil der print-Anweisung und nicht Teil der String-Variablen.

Wenn ich aber versuchen, das Problem in einem separaten Skript zu reproduzieren, wie folgt aus:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

regexp_expression = "^log på$" 
compare_string = "log på" 

if (re.match(regexp_expression, compare_string)): 
    print("result true") 
    result = True 
else : 
    print("result = false") 
    result = False 

Dann ist das Ergebnis wahr.

Wie kann das sein? Um es noch seltsamer zu machen, hat es früher gearbeitet, und ich bin nicht sicher, was ich bearbeitet habe, dass es Boom gemacht hat ...

Vollmodul der Regex-Vergleichsmethode ist hier unten. Ich habe das selbst nicht codiert, daher bin ich nicht zu 100% mit dem Grund aller replace-Anweisungen und der String-Manipulation vertraut, aber ich würde denken, dass es keine Rolle spielt, wenn ich die Strings kurz vor der fehlgeschlagenen Match-Methode überprüfen kann in der unteren ...

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

def regexp_compare(regexp_expression, compare_string): 
    #final int DOTALL 
    #try: // include try catch for "PatternSyntaxException" while testing/including a new symbol in this method.. 

    #catch(PatternSyntaxException e): 
    # System.out.println("Regexp>>"+regexp_expression) 
    # e.printStackTrace() 
    #*/ 


    if(not compare_string.strip() and (not regexp_expression.strip() or regexp_expression.strip().lower() == "*".lower()) or (regexp_expression.strip().lower() == ".*".lower())): 
     print("return 1") 
     return True     

    if(not compare_string or not regexp_expression): 
     print("return 2") 
     return False     

    regexp_expression = regexp_expression.lower() 
    compare_string = compare_string.lower() 

    if(not regexp_expression.strip()): 
     regexp_expression = "" 

    if(not compare_string.strip() and (not regexp_expression.strip() or regexp_expression.strip().lower() == "*".lower()) or (regexp_expression.strip().lower() == ".*".lower())): 
     regexp_expression = "" 
    else: 

     regexp_expression = regexp_expression.replace("\\","\\\\") 
     regexp_expression = regexp_expression.replace("\\.","\\\\.") 
     regexp_expression = regexp_expression.replace("\\*", ".*") 
     regexp_expression = regexp_expression.replace("\\(", "\\\\(") 
     regexp_expression = regexp_expression.replace("\\)", "\\\\)")   
     regexp_expression_arr = regexp_expression.split("|") 
     regexp_expression = "" 

     for i in range(0, len(regexp_expression_arr)): 
      if(not(regexp_expression_arr[i].startswith("^"))): 
       regexp_expression_arr[i] = "^"+regexp_expression_arr[i] 

      if(not(regexp_expression_arr[i].endswith("$"))): 
       regexp_expression_arr[i] = regexp_expression_arr[i]+"$" 

      regexp_expression = regexp_expression_arr[i] if regexp_expression == "" else regexp_expression+"|"+regexp_expression_arr[i] 




    result = None   

    print("Regex_expression: [" + regexp_expression+"]") 
    print("compare string: [" + compare_string+"]") 

    if (re.match(regexp_expression, compare_string)): 
     print("result true") 
     result = True 
    else : 
     print("result = false") 
     result = False 

    print("return result") 
    return result 
+0

'^ log på $' ist keine gute Verwendung von regulären Ausdrücken. Wenn Sie kein * Muster * haben, warum verwenden Sie nicht einfach '=='? – Maroun

+0

Die Sache ist, in meinem Fall ist es redundant mit dem^* $, aber das ist eine allgemeine util-Klasse für mehrere Übereinstimmungen verwendet, und ich bin nicht der Autor davon. Ich denke, dass es in anderen Fällen Gründe für die Regex-Syntax gibt. Wie wenn man prüfen muss, ob eine einzelne HTML-Klasse in der vollständigen Klassenzeichenfolge eines Elements vorhanden ist. Diesmal passe ich zufällig den Text der Knöpfe anstelle von Klassen an. – KjetilNordin

+0

Habe gerade festgestellt, dass ich die Syntax der Regex-Zeichenfolge falsch verstanden habe. Ich meinte zwar "beginnt mit ODER endet mit", aber das ODER ist ein UND. Ich stimme zu, dass dies eine Verschwendung von Regex ist. Ich weiß nicht, warum sie es so programmiert haben ... – KjetilNordin

Antwort

2

Es ist wahrscheinlich, dass Sie eine Unicode-Zeichenfolge mit einer Nicht-Unicode-Zeichenfolge vergleichen.

Zum Beispiel in dem folgenden:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

regexp_expression = "^log på$" 
compare_string = u"log på" 

if (re.match(regexp_expression, compare_string)): 
    print("result true") 
    result = True 
else : 
    print("result = false") 
    result = False 

Sie die Ausgabe falsch erhalten. Also gibt es wahrscheinlich einen Punkt in Ihrer Manipulation, wo etwas nicht Unicode ist.

Das gleiche falsche wird mit folgendem Ergebnis zu:

regexp_expression = u"^log på$" 
compare_string = "log på" 
+0

das ist großartig. Ich habe gerade diesen Ansatz verwendet: http://stackoverflow.com/questions/4987327/how-do-i-check-if-a-string-is-unicode-or-ascii. Stellt sich heraus, dass meine Regex-Übereinstimmung Unicode ist und die Vergleichszeichenfolge eine normale Zeichenfolge ist. Sie sind bereits so, bevor sie an die regex_compare-Methode gesendet werden. Vielen Dank! – KjetilNordin

Verwandte Themen