#python #django #unit-testing
#python #django #модульное тестирование
Вопрос:
Я пытаюсь создать тест, чтобы проверить, отображается ли ссылка на веб-странице.
Я не понимаю, что я делаю не так в этом тесте утверждения:
self.assertRegexpMatches( response.content, r'<a href="/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>')
Я знаю, что разметка есть на странице, потому что я скопировал ее из response.content
Я пытался использовать регулярное выражение в оболочке Python:
In [27]: links = """<div class="tabsA"><a href="/questions/?sort=active" title="Most recently updated questions">active</a><a href="/questions/?sort=newest" title="most recently asked questions">newest</a><a href="/questions/?sort=hottest" title="most active questions in the last 24 hours">hottest</a><a href="/questions/?sort=mostvoted" title="most voted questions">most voted</a><a href="/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a></div>"""
In [28]: re.search(r'<a href="/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>', links)
По какой-то причине у них это тоже не работает.
Как мне создать регулярное выражение, чтобы оно работало?
Комментарии:
1. вы должны избегать вопросительного знака. итак, его re.search(r’somestuff ?somemorestuff’)
2. Ироничный ответ: Что в этом плохого, так это то, что вы пытаетесь использовать регулярное выражение для разбора разметки. 😉
Ответ №1:
Почему вы используете регулярное выражение здесь? Для этого нет абсолютно никаких причин. Вы просто сопоставляете простую строку. Использовать:
self.assertContains(response, '<a href="/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>')
Ответ №2:
?
В вашем регулярном выражении интерпретируется как ?
квантификатор (конец этой части):
<a href="/questions/?...
Таким образом, движок никогда не сопоставляет литерал, ?
который появляется в строке, и вместо этого сопоставляет необязательный /
в этой позиции. Экранируйте его обратной косой чертой вот так:
<a href="/questions/?...
Ответ №3:
Вы должны избегать « ?
«, потому что этот символ имеет особое значение в регулярном выражении.
>>> re.search(r'<a href="/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>', links)
Ответ №4:
Чем? символ является специальным символом регулярного выражения и должен быть экранирован.
Регулярное выражение follow будет работать
<a href="/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>
Обратите внимание на перед ?
Отличный инструмент для работы с регулярными выражениями можно найти здесь:
Это может сэкономить вам ужасно много времени и головной боли…
Комментарии:
1. Лично я предпочитаю expresso
Ответ №5:
Вероятно, это символы «<» и «>». В некоторых синтаксисах регулярных выражений они являются специальными символами, которые указывают начало и конец строки.
Вы могли бы обратиться к инструменту regular expression tester, который поможет вам их изучить.
Комментарии:
1.
<
и>
не имеют особого значения в Python, за исключением случаев, когда они используются в именованной группе захвата(?P<name>...)
(или, дополнительно,<
используется в синтаксисах lookbehind(?<...)
и(?<!...)
).