Python re "фиктивная ошибка выхода" - PullRequest
9 голосов
/ 13 декабря 2010

Я возился с методом 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 ]

14 голосов
/ 13 декабря 2010

«фиктивный побег (конец строки)» означает, что ваш шаблон заканчивается обратной косой чертой. Это не имеет ничего общего с 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)  

Решение? Убедитесь, что ваш шаблон не заканчивается ни одной обратной косой чертой.

12 голосов
/ 01 января 2012

Решением этой проблемы является использование необработанной строки в качестве текста замены. Следующее не будет работать:

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

Будет выдано сообщение об ошибке: фиктивный выход (конец строки)

Но следующее будет отлично работать:

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

Теперь вопрос заключается в том, как преобразовать строку, сгенерированную во время выполнения программы, в необработанную строку в Python. Вы можете найти решение для этого здесь . Но я предпочитаю использовать для этого более простой метод:

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 в строки raw. Ну, до сегодняшнего дня это прекрасно сработало:)

3 голосов
/ 13 декабря 2010

Если вы пытаетесь найти «cur» в «tup [0]», вы должны сделать это с помощью блока «try: ... кроме: ...», чтобы перехватить неверный шаблон:

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.
3 голосов
/ 13 декабря 2010

Первый параметр re - это шаблон для поиска, поэтому, если 'cur' содержит обратную косую черту в конце строки, это будет недопустимая escape-последовательность. Вы, вероятно, подменили свои аргументы (я не знаю, что такое tup [0], но является ли это вашим паттерном?), И это должно быть так

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

Поскольку вы очень редко используете пользовательский ввод в качестве шаблона (если вы не используете механизм поиска по регулярным выражениям, в этом случае вы можете вместо этого показать ошибку).

НТН.

EDIT
Ошибка, о которой она сообщает, заключается в том, что вы используете escape-символ перед концом строки (что означает bogus escape (end of line)), то есть ваш шаблон заканчивается обратной косой чертой, которая не является допустимым шаблоном. За символом Escape (обратная косая черта) должен следовать другой символ, который удаляет или добавляет специальное значение этому символу (точно не известно, как это делает python, posix создает группы, добавляя escape-скобки, perl удаляет групповой эффект, экранируя его). То есть \* соответствует буквальной звездочке, тогда как * соответствует предыдущему символу 0 или более раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...