Python查找多个(单个字符)子字符串中的第一个

时间:2018-08-02 13:47:08

标签: python

在字符串中查找多个单个字符子字符串(如果有)中的第一个的最Python方式是什么?

要清楚,一个字符串可以包含多个感兴趣的字符,我想找到第一个-任何一个,我都不在乎哪个,也不需要知道哪个。我只想知道这些字符中的一个出现了,并且字符串中的第一个出现了这些字符(因此,显然不是对所提问题的重复)。

endDigitPos = digitText.find(['u', ' ', ')', '}', '/*'])

没有这样做

我一般在解析C代码-任何C代码。我实际上正在寻找以0x开头的十六进制字符串;找到了之后,我想找到十六进制字符串的结尾,它将是一个方括号,一个空格,u(如果是无符号的)或行尾。

digitText0x开头并以这些字符之一结尾。

上面的代码给出了

endDigitPos = digitText.find(['u', ' ', ')', '}', '/*'])
TypeError: must be str, not list

2 个答案:

答案 0 :(得分:2)

不知道这是否是“最pythonic”的方式,但是一个选择是

index = next(i for i,c in enumerate(s) if c in {'u', ' ', ')', '}', '/'})

注意:如果未找到任何项目,则会引发StopIteration。根据需要进行调整,具体取决于“项目不存在”情况下的要求。

注意2:正如Patrick在评论中指出的那样,这仅适用于单个字符,因此,如果您需要多子串方法,请使用他的建议解决方案

答案 1 :(得分:2)

我认为没有什么可以立即使用的,但是作为正则表达式很容易实现

import re

def find_many(instring, *substrings):
    pat = re.compile('|'.join([re.escape(s) for s in substrings]))
    match = pat.search(instring)
    if match is None:
        return -1
    else:
        return match.start() 

substrings = ['u', ' ', ')', '}', '/*']
find_many('aaa/*', *substrings)  #  3
find_many('aaab', *substrings)   # -1
find_many('uaaa/*', *substrings) #  0