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

StackOverflow https://stackoverflow.com/questions/2580654

Вопрос

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

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

>>> 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 из одной строки после некоторого изменения в спецификации 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

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

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

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

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

Editiadit It: Для справки, ошибка была подана с проектом Kodos: BUG # 437633.

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

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

Это было полезно?

Решение

Прочитайте ваше оригинальное регулярное выражение:

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

Это соответствует: ноль до двух косой, затем 0+ звезды, затем 0 или 1 "Whitespace символов" (пробелы, вкладки и т. Д.), Тогда буквальные символы 'todo' (и так далее).

Ваш Rawstring:

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

Так что есть литеральная обратная косание между косаями и 'todo', Поэтому, конечно, регулярное выражение не совпадает. Он не может - нигде в том, чтобы Regex вы выражаете любое желание, чтобы необязательно сопоставить буквальную обратную косание.

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

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

Обратите внимание, что обратная косание делает должны повторяться, чтобы «избежать себя», в этом случае.

Другие советы

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

Учти это Питонский скрипт.

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

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

% 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 для этого.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top