2015-07-06 8 views
5

Ho un progetto selenio/pitone, che usa una corrispondenza regolare per trovare elementi html. Questi attributi degli elementi includono talvolta i caratteri danese/norvegese ÆØÅ. Il problema è in questo frammento di seguito:La corrispondenza regex di Python fallisce con i caratteri UTF-8

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

Sia il regex_expression e compare_string sono manipolati prima dell'esecuzione del match regex. Se li stampa prima il frammento di codice di cui sopra viene eseguito, e anche stampare il risultato, ottengo il seguente output:

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

ho messo staffe per assicurarsi che non ci fossero spazi bianchi. Sono solo parte dell'istruzione print e non fanno parte delle variabili String.

Se io invece cerco di riprodurre il problema in uno script separato, in questo modo:

#!/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 

Poi il risultato è vero.

Come può essere? Per renderlo ancora più strano, ha funzionato prima, e non sono sicuro di quello che ho modificato, che lo ha fatto diventare boom ...

Il modulo completo del metodo di confronto regex è qui sotto. Non l'ho codificato personalmente, quindi non conosco al 100% il motivo di tutte le dichiarazioni di sostituzione e la manipolazione delle stringhe, ma penserei che non dovrebbe avere importanza, quando posso controllare le stringhe appena prima del metodo di corrispondenza non riuscita in basso ...

#!/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

'^ registro på $' non è un buon uso di espressioni regolari. Se non si dispone di un * pattern *, perché non usare semplicemente '=='? – Maroun

+0

Il fatto è che, nel mio caso, è ridondante con^* $, ma questa è una classe di utilità generale utilizzata per diverse corrispondenze e io non ne sono l'autore. Suppongo che ci siano dei motivi per la sintassi regex in altri casi. Come se fosse necessario verificare se una singola classe html è presente nella stringa completa della classe di un elemento. Questa volta mi capita di abbinare il testo dei pulsanti al posto delle classi. – KjetilNordin

+0

Mi sono appena accorto di aver sbagliato la sintassi della stringa regex. Pensavo volesse dire "inizia con OR finisce con", ma quell'OR è un AND. Concordo sul fatto che è uno spreco di regex. Non so perché hanno scelto di codificarlo in questo modo ... – KjetilNordin

risposta

2

È probabile che si stia confrontando una stringa unicode con una stringa non unicode.

Ad esempio, nel seguente:

#!/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 

otterrete l'uscita Falso. Quindi c'è probabilmente un punto nella tua manipolazione in cui qualcosa non è unicode.

La stessa falsa comporterà con il seguente troppo:

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

questo è fantastico. Ho appena usato questo approccio: http://stackoverflow.com/questions/4987327/how-do-i-check-if-a-string-is-unicode-or-ascii. Risulta che la mia regex match è unicode, e la stringa di confronto è una stringa normale. Sono già così prima di essere inviati al metodo regex_compare. Grazie! – KjetilNordin