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