2011-06-03 61 views
0

我正在嘗試創建一個測試來驗證鏈接是否在網頁上呈現。這個正則表達式有什麼問題?

我不明白我在做什麼錯了這一說法測試:

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

我知道的標記在頁面上,因爲我是從response.content

我試圖複製它在Python外殼中使用正則表達式:

In [27]: links = """<div class="tabsA"><a href="https://stackoverflow.com/questions/?sort=active" title="Most recently updated questions">active</a><a href="https://stackoverflow.com/questions/?sort=newest" title="most recently asked questions">newest</a><a href="https://stackoverflow.com/questions/?sort=hottest" title="most active questions in the last 24 hours">hottest</a><a href="https://stackoverflow.com/questions/?sort=mostvoted" title="most voted questions">most voted</a><a href="https://stackoverflow.com/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a></div>""" 

In [28]: re.search(r'<a href="https://stackoverflow.com/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>', links) 

由於某種原因,它不工作。

如何創建正則表達式使其起作用?

+0

你必須逃避問號。所以它的re.search(r'somestuff \?somemorestuff') – PeterT 2011-06-03 20:23:58

+5

舌頭在臉頰響應:它是什麼錯是你試圖使用正則表達式來解析標記。 ;-) – 2011-06-03 20:24:18

回答

0

The?字符是一個特殊的RegEx字符,必須轉義。

後續的正則表達式將工作

<a href="https://stackoverflow.com/questions/\?sort=elite" class="on" title="Staff Selected Questions">elite</a> 

注意\前?

爲瞎搞與正則表達式的一個很好的工具可以在這裏找到:

http://regexpal.com/

它可以節省非常多的時間和頭痛...

+0

個人而言,我更喜歡expresso – CaffGeek 2011-06-03 20:29:26

4

在你的正則表達式的?是得到解釋爲? quantifier(該部分的結束):

<a href="https://stackoverflow.com/questions/?...

因此,引擎永遠不會匹配出現在字符串中的文字?,而是在該位置匹配可選的/。與像這樣反斜槓轉義:

<a href="https://stackoverflow.com/questions/\?...

1

你應該逃脫「?」,因爲該符號對正則表達式特殊的意義。

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

這可能是「<」和「>」字符。在一些正則表達式語法中,它們是指示行的開始和結束的特殊字符。

您可能會看到一個regular expression tester工具來幫助您瞭解它們。

+1

'<' and '>'在Python中沒有特殊含義,除非它們用於命名捕獲組「(?P ...)'(或者,另外,'<'用於lookbehind語法'(?<...)'和'(?<!...)')。 – eldarerathis 2011-06-03 20:31:48

8

你爲什麼在這裏使用正則表達式?絕對沒有理由。你只是匹配一個簡單的字符串。使用方法:

self.assertContains(response, '<a href="https://stackoverflow.com/questions/?sort=elite" class="on" title="Staff Selected Questions">elite</a>') 
相關問題