Что не так с этим регулярным выражением?

#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>
  

Обратите внимание на перед ?

Отличный инструмент для работы с регулярными выражениями можно найти здесь:

http://regexpal.com/

Это может сэкономить вам ужасно много времени и головной боли…

Комментарии:

1. Лично я предпочитаю expresso

Ответ №5:

Вероятно, это символы «<» и «>». В некоторых синтаксисах регулярных выражений они являются специальными символами, которые указывают начало и конец строки.

Вы могли бы обратиться к инструменту regular expression tester, который поможет вам их изучить.

Комментарии:

1. < и > не имеют особого значения в Python, за исключением случаев, когда они используются в именованной группе захвата (?P<name>...) (или, дополнительно, < используется в синтаксисах lookbehind (?<...) и (?<!...) ).