我有一个 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
我加上括号以确保没有空格。它们只是打印语句的一部分,而不是字符串变量的一部分。
如果我尝试在单独的脚本中重现该问题,如下所示:
#!/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å"
关于Python 正则表达式匹配因 UTF-8 字符而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31244598/