Python re “虚假转义错误”

12 投票
4 回答
21885 浏览
提问于 2025-04-16 08:27

我在玩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 个回答

3

re的第一个参数是你要查找的模式,所以如果'cur'的末尾有一个反斜杠,那就会变成一个无效的转义序列。你可能把参数搞混了(我不知道tup[0]是什么,但它是你的模式吗?),应该像这样

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

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

希望这对你有帮助。

编辑:
它报告的错误是你在行末使用了转义字符(这就是bogus escape (end of line)的意思),也就是说你的模式以反斜杠结尾,这不是一个有效的模式。转义字符(反斜杠)后面必须跟着另一个字符,这样才能去掉或添加该字符的特殊含义(不太确定Python是怎么处理的,posix通过在括号前加反斜杠来创建分组,而perl则通过转义来去掉分组效果)。也就是说,\*匹配一个字面上的星号,而*则匹配前面的字符0次或多次。

12

解决这个问题的方法是使用原始字符串作为替换文本。下面这个写法是行不通的:

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字符串转换成原始字符串。嗯,这个方法到现在为止一直对我很有效 :)

18

"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)  

解决办法是什么呢?确保你的模式最后不要以一个单独的反斜杠结尾。

撰写回答