这个正则表达式有什么问题?

时间:2011-06-03 20:19:11

标签: python django unit-testing

我正在尝试创建一个测试来验证链接是否在网页上呈现。

我不理解我在这个断言测试中做错了什么:

self.assertRegexpMatches( response.content, r'<a href="/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>')

我知道标记在页面上,因为我从response.content

复制了它

我尝试在Python shell中使用正则表达式:

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)

出于某种原因,它们也无法正常工作。

如何创建正则表达式以使其有效?

5 个答案:

答案 0 :(得分:8)

为什么你在这里使用正则表达式?绝对没有理由。你只是匹配一个简单的字符串。使用:

self.assertContains(response, '<a href="/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>')

答案 1 :(得分:4)

正则表达式中的?被解释为? quantifier(本部分的结尾):

<a href="/questions/?...

因此,引擎永远不会匹配字符串中显示的文字?,而是匹配该位置的可选/。用反斜杠逃避它:

<a href="/questions/\?...

答案 2 :(得分:1)

你应该逃避“?”,因为该符号在正则表达式中具有特殊含义。

>>> re.search(r'<a href="/questions/\?sort=elite" class="on" title="Staff Selected Questions">elite</a>', links)

答案 3 :(得分:0)

? character是一个特殊的RegEx字符,必须进行转义。

以下正则表达式将起作用

<a href="/questions/\?sort=elite" class="on" title="Staff Selected Questions">elite</a>

之前注意\

可以在这里找到一个搞乱RegEx的好工具:

http://regexpal.com/

它可以为你节省大量的时间和麻烦......

答案 4 :(得分:-1)

可能是“&lt;”和“&gt;”字符。在一些正则表达式语法中,它们是表示行的开头和结尾的特殊字符。

您可以查看regular expression tester工具来帮助您了解它们。