如何在python中搜索字符串中最后一个正则表达式?

时间:2015-10-20 09:20:48

标签: python regex string

在python中,我可以轻松地在字符串中搜索第一次出现的正则表达式:

import re
re.search("pattern", "target_text")

现在我需要在字符串中找到最后一次出现的正则表达式,re模块似乎不支持这种情况。

我可以将字符串反转为“搜索第一次出现”,但我还需要反转正则表达式,这是一个更难的问题。

我也可以迭代从左到右查找所有事件,并保留最后一个,但这看起来很尴尬。

有没有一种聪明的方法可以找到最合适的事件?

3 个答案:

答案 0 :(得分:8)

一种方法是在正则表达式前加(?s:.*),并强制引擎尝试在最远位置进行匹配并逐渐退出:

re.search("(?s:.*)pattern", "target_text")

请注意,此方法的结果可能与re.findall("pattern", "target_text")[-1]不同,因为findall方法搜索非重叠匹配,而不是所有可匹配的子字符串包含在结果中。

例如,在a.a上执行正则表达式abacafindall将返回aba作为唯一匹配并选择它作为最后一个匹配,而上面的代码将返回aca作为匹配。

另一种方法是使用regex包,它支持REVERSE匹配模式。

结果与(?s:.*)包中re的方法大致相同,如上所述。但是,由于我自己没有尝试过该软件包,因此不清楚后向引用在REVERSE模式下是如何工作的 - 在这种情况下模式可能需要修改。

答案 1 :(得分:2)

import re
re.search("pattern(?!.*pattern)", "target_text")

import re
re.findall("pattern", "target_text")[-1]

您可以使用这两种方法。

如果您想positions使用

x="abc abc abc"
print [(i.start(),i.end(),i.group()) for i in re.finditer(r"abc",x)][-1]

答案 2 :(得分:0)

一种方法是使用split。例如,如果您想获取此示例字符串中':'之后的最后一组:

out = pd.DataFrame(A/B,idx).T
out.columns = ['a/b','D']