在Python中查找字符串中多个字符的最后一次出现

时间:2015-08-11 19:46:01

标签: python string

我想在字符串中找到最后一次出现的字符。

str.rfind()将给出字符串中单个字符最后一次出现的索引,但我需要最后一次出现多个字符的索引。例如,如果我有一个字符串:

test_string = '([2+2])-[3+4])'

我想要一个函数返回{,[,或{类似于

的最后一次出现的索引
test_string.rfind('(', '[', '{')

理想情况下会返回8.最好的方法是什么?

max(test_string.rfind('('), test_string.rfind('['), test_string.rfind('{'))

似乎笨重而不是Pythonic。

4 个答案:

答案 0 :(得分:6)

您可以使用生成器表达式以Pythonic方式执行此操作。

max(test_string.rfind(i) for i in "([{")

这将迭代您要检查的字符列表/元组,并对它们使用rfind(),将这些值组合在一起,然后返回最大值。

答案 1 :(得分:1)

这非常简洁,并且可以解决问题。

max(map(test_string.rfind, '([{'))

答案 2 :(得分:1)

你可以使用reverse来获取第一个匹配的字符串的结尾,使用字符串-1的长度 - 索引i来获取索引从头开始计数,最坏的情况是单个传递字符串:

test_string = '([2+2])-[3+4])'
st = {"[", "(", "{"}
print(next((len(test_string) - 1 - i 
            for i, s in enumerate(reversed(test_string)) if s in st),-1))
8 

如果没有匹配项,您将获得-1作为默认值。如果您要搜索大量的子字符串,而不是为要匹配的每个子字符串执行O(n) rfind,然后获取所有这些子字符串的最大值,则效率会更高

答案 3 :(得分:0)

>>> def last_of_many(string, findees):
...     return max(string.rfind(s) for s in findees)
... 
>>> test_string = '([2+2])-[3+4])'
>>> last_of_many(test_string, '([{')
8
>>> last_of_many(test_string, ['+4', '+2'])
10
>>>