简体   繁体   中英

find last occurence of multiple characters in a string in Python

I would like to find the last occurrence of a number of characters in a string.

str.rfind() will give the index of the last occurrence of a single character in a string, but I need the index of the last occurrence of any of a number of characters. For example if I had a string:

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

I would want a function that returns the index of the last occurence of {, [, or { similar to

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

Which would ideally return 8. What is the best way to do this?

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

seems clunky and not Pythonic.

You can use generator expression to do this in a Pythonic way.

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

This iterates through the list/tuple of characters that you want to check and uses rfind() on them, groups those values together, and then returns the maximum value.

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

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

You can use reversed to start at the end of the string getting the first match, using the length of the string -1 - the index i to get the index counting from the start, doing at worst a single pass over the string:

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 

If there is no match, you will get -1 as the default value. This is a lot more efficient if you a large amount of substrings to search for than doing an O(n) rfind for every substring you want to match and then getting the max of all those

>>> 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
>>> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM