Mam projekt selenu/pythonu, który używa dopasowania regularnego do znalezienia elementów html. Te atrybuty elementów kiedyś zawierają duńskie/norweskie znaki ÆÆÅ. Problem jest w tym fragmencie poniżej:Dopasowanie do wyrażenia regularnego w języku Python kończy się niepowodzeniem ze znakami UTF-8
if (re.match(regexp_expression, compare_string)):
result = True
else :
result = False
Zarówno regex_expression
i compare_string
są manipulowane przed meczem regex zostaje wykonana. Jeśli mogę wydrukować je przed fragmentem kodu powyżej jest wykonywany, a także wydrukować wyniki, pojawia się następujący komunikat:
Regex_expression: [^log på$]
compare string: [log på]
result = false
umieścić wsporniki, aby upewnić się, że nie było żadnych spacji. Są one tylko częścią instrukcji print, a nie częścią zmiennych String.
Gdybym jednak spróbować odtworzyć problem w skrypcie indywidualne, jak to:
#!/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
Następnie wynik jest prawdziwy.
Jak to możliwe? Aby było jeszcze dziwniej, działało wcześniej i nie jestem pewien, co redagowałem, co sprawiło, że przeszło boom ...
Pełny moduł metody porównywania regex znajduje się poniżej. Sam tego nie zakodowałem, więc nie jestem w 100% zaznajomiony z przyczyną wszystkich instrukcji zastępowania i manipulacją String, ale uważam, że nie powinno to mieć znaczenia, kiedy mogę sprawdzić ciągi znaków tuż przed metodą niepowodzenia dopasowania na dole ...
#!/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å $' nie jest dobre wykorzystanie regexes. Jeśli nie masz * wzorca *, dlaczego nie po prostu użyć '=='? – Maroun
Chodzi o to, że w moim przypadku jest zbędny z^* $, ale jest to ogólna klasa użytkowa używana w kilku meczach i nie jestem jej autorem. Sądzę, że istnieją powody dla składni regex w innych przypadkach. Na przykład, jeśli trzeba sprawdzić, czy pojedyncza klasa html jest obecna w pełnym łańcuchu klasy elementu. Tym razem akurat dopasowałem tekst do przycisków zamiast do klas. – KjetilNordin
Właśnie zdałem sobie sprawę, że mam źle złożoną składnię łańcucha regex. Chociaż oznaczało to "zaczyna się od LUB kończy się na", ale OR jest AND. Zgodziłbym się, że to strata regex. Nie wiem, dlaczego zdecydowali się zakodować to w ten sposób ... – KjetilNordin