簡體   English   中英

Python正則表達式匹配失敗,帶有UTF-8字符

[英]Python regex match fails with UTF-8 characters

我有一個selenium / python項目,它使用正則表達式匹配來查找html元素。 這些元素屬性有時包括丹麥語/挪威語字符ÆØÅ。 問題出在下面的代碼段中:

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

在執行正則表達式匹配之前,都會操縱regex_expressioncompare_string 如果我在執行上面的代碼片段之前打印它們,並打印結果,我會得到以下輸出:

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

我把括號放在上面以確保沒有空格。 它們只是print語句的一部分,而不是String變量的一部分。

但是,如果我嘗試在單獨的腳本中重現問題,如下所示:

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

那么結果是真的。

怎么會這樣? 為了使它更奇怪,它更早地工作,我不確定我編輯的是什么讓它變得繁榮......

正則表達式比較方法的完整模塊如下所示。 我自己沒有編寫這個,所以我不是100%熟悉所有替換語句和字符串操作的原因,但我認為它應該無關緊要,當我可以在失敗的匹配方法之前檢查字符串在底部...

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

您可能正在將unicode字符串與非unicode字符串進行比較。

例如,在以下內容中:

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

您將獲得輸出False。 所以你的操作中可能有一點不是unicode。

同樣的錯誤也會導致以下情況:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM