在字符串中查找多个单个字符子字符串(如果有)中的第一个的最Python方式是什么?
要清楚,一个字符串可以包含多个感兴趣的字符,我想找到第一个-任何一个,我都不在乎哪个,也不需要知道哪个。我只想知道这些字符中的一个出现了,并且字符串中的第一个出现了这些字符(因此,显然不是对所提问题的重复)。
endDigitPos = digitText.find(['u', ' ', ')', '}', '/*'])
没有这样做
我一般在解析C代码-任何C代码。我实际上正在寻找以0x
开头的十六进制字符串;找到了之后,我想找到十六进制字符串的结尾,它将是一个方括号,一个空格,u
(如果是无符号的)或行尾。
digitText
以0x
开头并以这些字符之一结尾。
上面的代码给出了
endDigitPos = digitText.find(['u', ' ', ')', '}', '/*'])
TypeError: must be str, not list
答案 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