我想使用正则表达式匹配模式的最后一次出现。
我有这样的文字结构:
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来测试我的正则表达式
答案 0 :(得分:15)
对我而言,最明确的方式是:
>>> re.findall('<br>(.*?)<br>', text)[-1]
'Tizi Ouzou'
答案 1 :(得分:14)
使用内置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
答案 2 :(得分:7)
查看相关问题:you shouldn't parse HTML with regex。请改用正则表达式解析器。对于Python,我听说Beautiful Soup是要走的路。
无论如何,如果您想使用正则表达式执行此操作,则需要确保.*
无法通过其他<br>
。要做到这一点,在使用每个字符之前,我们可以使用lookahead来确保它不会启动另一个<br>
:
<br>(?:(?!<br>).)*<br>\s*$
答案 3 :(得分:6)
你可以在贪婪量词中使用减少的字符类(假设你之间没有标签<br>
):
<br>([^<]*)<br>\s*$
或
<br>((?:[^<]+|<(?!br>))*)<br>\s*$
允许内部标记。
由于您搜索的字符串为Tizi Ouzou
而没有<br>
,因此您可以提取第一个捕获组。
答案 4 :(得分: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 :(得分: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)