[英]Python regex match fails with UTF-8 characters
我有一個selenium / python項目,它使用正則表達式匹配來查找html元素。 這些元素屬性有時包括丹麥語/挪威語字符ÆØÅ。 問題出在下面的代碼段中:
if (re.match(regexp_expression, compare_string)):
result = True
else :
result = False
在執行正則表達式匹配之前,都會操縱regex_expression
和compare_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.