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>到最后一个的所有内容。

注意:我在 python 上,我正在使用pythex来测试我的正则表达式

4

6 回答 6

14

对我来说,最清楚的方法是:

>>> re.findall('<br>(.*?)<br>', text)[-1]
'Tizi Ouzou'
于 2013-08-24T19:56:33.863 回答
13

使用内置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
于 2013-08-24T19:45:21.573 回答
7

查看相关问题:您不应该使用 regex 解析 HTML。请改用正则表达式解析器。对于 Python,我听说Beautiful Soup是要走的路。

无论如何,如果你想用正则表达式来做,你需要确保.*不能超过另一个<br>. 为此,在使用每个字符之前,我们可以使用前瞻来确保它不会开始另一个<br>

<br>(?:(?!<br>).)*<br>\s*$
于 2013-08-24T19:46:51.703 回答
6

您可以在具有简化字符类的贪婪量词中使用(假设您之间没有标签<br>):

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

或者

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

允许标签在里面。

由于您搜索的字符串Tizi Ouzou没有<br>您可以提取第一个捕获组。

于 2013-08-24T19:44:16.443 回答
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
于 2013-08-24T19:46:29.280 回答
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)
于 2013-08-24T19:44:45.900 回答