Python重新“虚假逃脱错误”

时间:2010-12-13 08:59:16

标签: python regex tkinter

我一直在搞乱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)

4 个答案:

答案 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.