我一直在搞乱python re modules .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)
答案 0 :(得分:14)
“伪造逃生(行尾)”表示您的图案以反斜杠结尾。这与Tkinter无关。您可以在交互式shell中轻松复制错误:
>>> 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)
解决方案?确保您的模式不会以一个反斜杠结束。
答案 1 :(得分:12)
此问题的解决方案是使用原始字符串作为替换文本。以下内容不起作用:
re.sub('this', 'This \\', 'this is a text')
它会抛出错误:bogus escape(行尾)
但以下情况会很好:
re.sub('this', r'This \\', 'this is a text')
现在,问题是如何将程序运行时生成的字符串转换为Python中的原始字符串。您可以找到此here的解决方案。但我更喜欢使用更简单的方法来做到这一点:
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字符串转换为原始字符串。嗯,这对我来说一直很好,直到约会:)
答案 2 :(得分:3)
要重新显示的第一个参数是要搜索的模式,因此如果'cur'在行尾包含反斜杠,则它将是无效的转义序列。你可能已经交换了你的论点(我不知道tup [0]是什么,但它是你的模式吗?)它应该是这样的
se = re.search(tup[0], cur, flags=re.IGNORECASE)
由于您很少将用户输入用作模式(除非您正在使用正则表达式搜索机制,否则您可能希望显示错误)。
HTH。
修改的:
它报告的错误是你在行尾之前使用转义字符(这是bogus escape (end of line)
的意思),也就是你的模式以反斜杠结尾,这不是有效的模式。转义字符(反斜杠)必须后跟另一个字符,它会删除或添加该字符的特殊含义(不确定python是如何做到的,posix通过向括号添加转义来创建组,perl通过转义它来移除组效果)。即\*
匹配文字星号,而*
匹配前一个字符0次或更多次。
答案 3 :(得分:3)
如果你试图在“tup [0]”中搜索“cur”,你应该通过“try:... except:...”块来捕捉无效模式:
try :
se = re.search(cur, tup[0], flags=re.IGNORECASE)
except re.error, e:
# print to stdout or any status widget in your gui
print "Your search pattern is not valid."
# Some details for error:
print e
# Or some other code for default action.