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
'^ registro på $' non è un buon uso di espressioni regolari. Se non si dispone di un * pattern *, perché non usare semplicemente '=='? – Maroun
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
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