2015-07-06 15 views
5

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 
+0

'^ log på $' nie jest dobre wykorzystanie regexes. Jeśli nie masz * wzorca *, dlaczego nie po prostu użyć '=='? – Maroun

+0

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

+0

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

Odpowiedz

2

Jest prawdopodobne, że porównywane są ciągi znaków Unicode z ciągami nie będącymi znakami Unicode.

Na przykład, w następujących przypadkach:

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

Dostaniesz wyjście False. Prawdopodobnie w twojej manipulacji istnieje punkt, w którym coś nie jest unicode.

To samo fałszywe spowoduje z następujących też:

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

to jest świetne. Po prostu użyłem tego podejścia: http://stackoverflow.com/questions/4987327/how-do-i-check-if-a-string-is-unicode-or-ascii. Okazuje się, że moje dopasowanie do wyrażenia regularnego to kod Unicode, a ciąg porównania to zwykły ciąg znaków. Są już w ten sposób, zanim zostaną wysłane do metody regex_compare. Dzięki! – KjetilNordin

Powiązane problemy