Python re “虚假转义错误”
我在玩Python的re模块中的.search方法。cur是从Tkinter的输入框获取的内容。每当我在输入框里输入一个反斜杠“\”时,就会出现这个错误。我不太明白这个错误是什么,也不知道该怎么处理。任何建议都非常感谢。
cur是一个字符串。
tup[0]也是一个字符串。
代码片段:
se = re.search(cur, tup[0], flags=re.IGNORECASE)
错误信息:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python26\Lib\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "C:\Python26\Suite\quidgets7.py", line 2874, in quick_links_results
self.quick_links_results_s()
File "C:\Python26\Suite\quidgets7.py", line 2893, in quick_links_results_s
se = re.search(cur, tup[0], flags=re.IGNORECASE)
File "C:\Python26\Lib\re.py", line 142, in search
return _compile(pattern, flags).search(string)
File "C:\Python26\Lib\re.py", line 245, in _compile
raise error, v # invalid expression
error: bogus escape (end of line)
4 个回答
re的第一个参数是你要查找的模式,所以如果'cur'的末尾有一个反斜杠,那就会变成一个无效的转义序列。你可能把参数搞混了(我不知道tup[0]是什么,但它是你的模式吗?),应该像这样
se = re.search(tup[0], cur, flags=re.IGNORECASE)
通常你很少把用户输入作为模式(除非你在做正则表达式搜索机制,这种情况下你可能想要显示错误信息)。
希望这对你有帮助。
编辑:
它报告的错误是你在行末使用了转义字符(这就是bogus escape (end of line)
的意思),也就是说你的模式以反斜杠结尾,这不是一个有效的模式。转义字符(反斜杠)后面必须跟着另一个字符,这样才能去掉或添加该字符的特殊含义(不太确定Python是怎么处理的,posix通过在括号前加反斜杠来创建分组,而perl则通过转义来去掉分组效果)。也就是说,\*
匹配一个字面上的星号,而*
则匹配前面的字符0次或多次。
解决这个问题的方法是使用原始字符串作为替换文本。下面这个写法是行不通的:
re.sub('this', 'This \\', 'this is a text')
这样会报错:无效的转义(行末)
但是下面这个写法就可以正常工作:
re.sub('this', r'This \\', 'this is a text')
现在,问题是如何把在程序运行时生成的字符串转换成原始字符串。在这里你可以找到一个解决方案:这里。不过我更喜欢用一种更简单的方法来做到这一点:
def raw_string(s):
if isinstance(s, str):
s = s.encode('string-escape')
elif isinstance(s, unicode):
s = s.encode('unicode-escape')
return s
上面的方法只能把ascii和unicode字符串转换成原始字符串。嗯,这个方法到现在为止一直对我很有效 :)
"bogus escape (end of line)"的意思是你的模式以一个反斜杠结尾。这和Tkinter没有关系。你可以在交互式命令行中很容易地重现这个错误:
>>> import re
>>> pattern="foobar\\"
>>> re.search(pattern, "foobar")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 142, in search
return _compile(pattern, flags).search(string)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/re.py", line 241, in _compile
raise error, v # invalid expression
sre_constants.error: bogus escape (end of line)
解决办法是什么呢?确保你的模式最后不要以一个单独的反斜杠结尾。