Передача строки с (случайным) escape-символом теряет символ, даже если это необработанная строка - PullRequest
1 голос
/ 05 апреля 2010

У меня есть функция с python doctest, которая не работает, потому что одна из тестовых входных строк имеет обратную косую черту, которая обрабатывается как escape-символ, даже если я закодировал строку как необработанную строку.

Мой doctest выглядит так:

>>> infile = [ "Todo:        fix me", "/** todo: fix", "* me", "*/", r"""//\todo      stuff to fix""", "TODO fix me too", "toDo bug 4663" ]
>>> find_todos( infile )
['fix me', 'fix', 'stuff to fix', 'fix me too', 'bug 4663']

И функция, предназначенная для извлечения текстов задач из одной строки после некоторого изменения спецификации todo, выглядит следующим образом:

todos = list()
for line in infile:
    print line
    if todo_match_obj.search( line ):
        todos.append( todo_match_obj.search( line ).group( 'todo' ) )

И регулярное выражение под названием todo_match_obj имеет вид:

r"""(?:/{0,2}\**\s?todo):?\s*(?P<todo>.+)"""

Быстрый разговор с моей оболочкой ipython дает мне:

In [35]: print "//\todo"
//      odo

In [36]: print r"""//\todo"""
//\todo

И, на случай, если реализация doctest использует stdout (я не проверял, извините):

In [37]: sys.stdout.write( r"""//\todo""" )
//\todo

Мой regex-foo невысок по любым меркам, и я понимаю, что мог бы что-то здесь упустить.

РЕДАКТИРОВАТЬ: После ответа Алекса Мартеллиса, я хотел бы посоветовать, какое регулярное выражение будет фактически соответствовать взорванному r"""//\todo fix me""". Я знаю, что изначально я не просил кого-то сделать домашнее задание, и я приму ответ Алекса, поскольку он действительно ответил на мой вопрос (или подтвердил мои опасения). Но я обещаю высказать любые хорошие решения моей проблемы здесь:)

EDITEDIT: для справки, в проекте kodos была обнаружена ошибка: ошибка # 437633

Я использую Python 2.6.4 (r264: 75706, 7 декабря 2009, 18:45:15)

Спасибо, что прочитали это далеко (если вы пропустили прямо здесь, я понимаю)

Ответы [ 2 ]

2 голосов
/ 05 апреля 2010

Внимательно прочитайте свое оригинальное регулярное выражение:

r"""(?:/{0,2}\**\s?todo):?\s*(?P<todo>.+)"""

Соответствует: косая черта от нуля до двух, затем звездочки 0+, затем 0 или 1 «пробельные символы» (пробелы, табуляции и т. Д.), Затем буквенные символы 'todo' (и т. Д.).

Ваша строка:

r"""//\todo      stuff to fix"""

так что между слешами и 'todo' существует буквальная обратная косая черта, поэтому, конечно, регулярное выражение не соответствует ему. Это не может - нигде в этом регулярном выражении вы не выражаете никакого желания опционально сопоставить буквальную обратную косую черту.

Редактировать : Шаблон RE, очень близкий к вашему, который будет принимать и игнорировать дополнительную обратную косую черту прямо перед тем, как 't' будет:

r"""(?:/{0,2}\**\s?\\?todo):?\s*(?P<todo>.+)"""

обратите внимание, что обратную косую черту нужно повторить, чтобы в этом случае "убежать".

1 голос
/ 06 апреля 2010

Это становится еще более странным, когда я решаюсь пойти по дороге докутов.

Рассмотрим этот скрипт Python .

Если вы раскомментируете строки 22 и 23, сценарий проходит нормально, так как метод возвращает True, что утверждается и сравнивается явным образом.

Но если вы запустите файл в том виде, в котором он находится в ссылке, doctest потерпит неудачу с сообщением:

% python doctest_test.py                                                                                                          
**********************************************************************
File "doctest_test.py", line 3, in __main__.doctest_test
Failed example:
    doctest_test( r"""//    odo""" )
Exception raised:
    Traceback (most recent call last):
      File "/usr/lib/python2.6/doctest.py", line 1241, in __run
        compileflags, 1) in test.globs
      File "<doctest __main__.doctest_test[0]>", line 1, in <module>
        doctest_test( r"""//    odo""" )
      File "doctest_test.py", line 14, in doctest_test
        assert input_string == compare_string
    AssertionError
**********************************************************************
1 items had failures:
   1 of   1 in __main__.doctest_test
***Test Failed*** 1 failures.

Может ли кто-нибудь просветить меня здесь?

Я все еще использую Python 2.6.4 для этого.

Я помещаю этот ответ в «сообщество вики», так как в действительности он не имеет отношения к репутации и не имеет отношения к вопросу.

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