2013-08-24 60 views
7

我想使用正則表達式匹配上一次發生的模式。匹配上一次發生與正則表達式

我有些文本的結構是這樣的:

Pellentesque habitant morbi tristique senectus et netus et 
lesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae 
ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam 
egestas <br>semper<br>tizi ouzou<br>Tizi Ouzou<br>       

我想兩個<br>之間的最後文本在我的情況<br>Tizi Ouzou<br>,理想的Tizi Ouzou

注匹配,有一些空格在最後<br>

我試過這個:

<br>.*<br>\s*$ 

但它會選擇從第一個<br>到最後一個的所有內容。

NB:我對Python和我使用pythex來測試我的正則表達式

+1

嘗試'*? '而不是'。*'。 –

+1

@WaleedKhan不會幫助 –

回答

12

使用內置str功能的非正則表達式的方法的註釋:

text = """ 
Pellentesque habitant morbi tristique senectus et netus et 
lesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae 
ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam 
egestas <br>semper<br>tizi ouzou<br>Tizi Ouzou<br>  """ 

res = text.rsplit('<br>', 2)[-2] 
#Tizi Ouzou 
5

你可以貪婪量詞與減少的字符類中使用(假設你有<br>之間沒有標籤):

<br>([^<]*)<br>\s*$ 

<br>((?:[^<]+|<(?!br>))*)<br>\s*$ 

,讓裏面的標籤。

由於您搜索的字符串是Tizi Ouzou而不是<br>您可以提取第一個捕獲組。

+0

@ m.buettner:你說得對,因爲字符串從左到右分析,並停止在第一次出現'
' –

3

嘗試:

re.match(r'(?s).*<br>(?=.*<br>)(.*)<br>', s).group(1) 

它首先消耗的所有數據,直到最後<br>和回溯,直到它與前瞻檢查是否存在另一個<br>後,然後提取它們之間的內容。

它產生:

Tizi Ouzou 

編輯:無需先行。替代(用相同的結果)總部設在m.buettner

re.match(r'(?s).*<br>(.*)<br>', s).group(1) 
+1

不需要預見 - 先行檢查後的模式完全一樣的東西。 –

+0

@ m.buettner:謝謝。將該版本添加到答案中。 – Birei

4

.*如何[^<>]*代替:

import re 


text = """Pellentesque habitant morbi tristique senectus et netus et 
lesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae 
ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam 
egestas <br>semper<br>tizi ouzou<br>Tizi Ouzou<br> """ 


print re.search('<br>([^<>]*)<br>\s*$', text).group(1) 

打印

Tizi Ouzou 
5

看看相關的問題:you shouldn't parse HTML with regex。改用正則表達式解析器。對於Python,我聽到Beautiful Soup是要走的路。

無論如何,如果你想用正則表達式,你需要確保.*不能通過另一個<br>。要做到這一點,消費每個角色之前,我們可以用一個lookahead,以確保它不會啓動另一個<br>

<br>(?:(?!<br>).)*<br>\s*$ 
+0

+1美麗的湯 – P0W

14

對我來說,最明顯的方法是:

>>> re.findall('<br>(.*?)<br>', text)[-1] 
'Tizi Ouzou' 
+2

+1好主意! <°)))))> –