2010-12-13 52 views
7

我一直在与蟒蛇重新模块。搜索方法。 当前是是来自Tkinter入口小部件的输入。每当我在条目窗口小部件中输入“\”时,都会引发此错误。我并不是全部要确定错误是什么或如何处理。任何有识之士将不胜感激。Python重新“伪冒逃逸错误”

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) 

回答

12

“假冒逃生(行结束)”表示您的模式以反斜杠结尾。这与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) 

解决方案?确保你的模式不以一个反斜杠结束。

+0

能否像普通人物一样对待\ \?类似于r“字符串”方法。 – rectangletangle 2010-12-13 23:09:41

+2

@ Anteater7171:反斜杠对于正则表达式是特殊的。您有两个选择:不要使用正则表达式或修改字符串,以便删除特殊含义。对于后者,添加一个额外的反斜杠就可以实现这个技巧(即:模式'\\'意味着一个文字反斜杠)。 – 2010-12-14 03:08:49

+0

+1您应该已将最新评论添加到答案中。为了扩展评论,在例如re.search将意味着使用''pattern =“foobar \\\\”''',即您需要4个反斜杠,因此re.search的模式参数最终有两个,这会产生合法的正则表达式。 – ThomasH 2012-09-19 08:41:20

3

第一个参数重新是要搜索的模式,因此如果'cur'在行的末尾包含反斜线,它将是无效的转义序列。你可能已经换你的论点左右(我不知道是什么TUP [0],但它是你的模式?),它应该是这样的

se = re.search(tup[0], cur, flags=re.IGNORECASE) 

正如你很少使用用户输入作为模式(除非你正在做一个正则表达式搜索机制,在这种情况下你可能想要显示错误)。

HTH。

编辑
它报告错误是,你正在使用转义字符线年底前(这是什么bogus escape (end of line)手段),这是您的模式以反斜线结束,这是不是一个有效模式。转义字符(反斜杠)后面必须跟着另一个字符,这会删除或为该字符添加特殊含义(不确定python是如何实现的,posix通过向括号添加转义来创建组,perl通过转义删除组效果)。即\*与字面asterix匹配,而*匹配前面的字符0或更多次。

+0

我正在使用用户输入来搜索tup [0]的内容。 cur是我的模式。 – rectangletangle 2010-12-13 09:09:28

+1

@Anteater;那么,如果cur是模式,即用户正在输入模式,那显然是不正确的,并且用户需要知道它。 – falstro 2010-12-13 09:35:50

+0

取决于用户是否认为他们正在输入正则表达式。如果他们认为他们正在输入固定字符串,则代码需要修复。如果他们认为他们正在进入正式表达,他们应该被告知该表达无效(但希望本着通知或教导的精神而非惩罚)。 – 2010-12-14 03:11:14

3

如果你想在搜索“小人”,“锤头[0]”你应该通过这样做“尝试:...除了:......”块捕获无效模式:

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. 
12

此问题的解决方案是使用原始字符串作为替换文本。以下将不起作用:

re.sub('this', 'This \\', 'this is a text') 

它会抛出错误:假逃生(行尾)

但下面的工作就好了:

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字符串转换成原始字符串。那么,这对我来说一直工作到日期:)