背景:想取出某个字符串中的一部分。该字符有一定特征:一些字符间有符号'-',可以借助这些特征来提取字符。本文介绍find和rfind来帮助大家提取出来字符串。

举例子:12345-6789-OpenStackVm,OpenStackVm-01或-02或-0X,qwertyui-OpenStackVm-01,要从这些字符中过滤出来含有OpenStackVm这几个字符,然后和预期进行对比,使用find和rfind即可。

特殊说明下,OpenStackVm这几个字符只是举例,也有可能是OpenStackHost等不固定的字符,但是特征都一样:要么取到首部要么取到尾部要么取到中间位置的字符(通过-等字符可以找到一定的位置)。

find() 返回所查找字符串第一次出现的索引,如果没有匹配项则返回-1。

rfind() 返回所查找字符串第最后一次出现的索引,如果没有匹配项则返回-1。find和rfind的使用方法一样,以find为例。

str.find(substr, start, end),其中substr是要找的字符串,start是开始查找的索引且包含此索引,end是结束查找的索引且不包含此索引,str是想要查找substr的字符串。通过substr索引,取末尾字符,str='12345-6789-OpenStackVm'

str[str.rfind("-") +1:]

即可获取到OpenStackVm,其中str.rfind("-") 返回10,从最后一位开始第一次出现"-"字符的索引(正常索引从0开始计数),从11位开始算就是O字符,则剩余的为OpenStackVm。通过substr索引,取首部字符,str="OpenStackVm-01"或-02或-0X

str[:str.find("-")]

即可获取到OpenStackVm,其中str.find("-") 返回11,从第一位开始第一次出现"-"字符的索引(正常索引从0开始计数),从第1位开始算到第11位就是OpenStackVm。通过substr索引,取某中间位置字符,str="qwertyui-OpenStackVm-01"

str[str.find("-")+1:str.rfind("-")]

即可获取到OpenStackVm,其中str.find("-") 返回8,从第一位开始第一次出现"-"字符的索引(正常索引从0开始计数),str.rfind("-") 返回20,从最后一位开始第一次出现"-"字符的索引(正常索引从0开始计数)从第9位开始算到第20位就是OpenStackVm。当然如果是仅仅为了得到OpenStackVm,你还可以这样处理

str.find("OpenStackVm")或str.rfind("OpenStackVm")

当返回值为非-1时则表示该字符串中有你想要的字符(注意区分大小写)。

当返回值为0则表示在字符串的首部

其他值则表示为该字符在字符串中真实的位置。当substr出现多次时,还可以这样取字符,str="123456-OpenStackVm-robot-01"或-test-02或-boy-0X

str[str.find("-")+1:str.rfind("-", 0, str.rfind("-")-1)]

str="123456-OpenStackVm-robot-01"整体思路是先找到01前面的"-"的索引x,然后从第1位开始到x这个位置的前1个字符,再接着找robot前面的"-"的索引y,也就是OpenStackVm后的"-"的索引y,接下来再找OpenStackVm前的"-"的索引z。

str.rfind("-")-1)先找到倒数第二次出现"-"的位置,注意为何是减1呢?虽然倒数第1次出现"-"和倒数第2次出现"-"的中间字符不固定,有可能5个有可能4个,只要找到倒数第1次出现"-"的索引x的前面1个字符的索引即可。

str.rfind("-", 0, str.rfind("-")-1)从第1位开始到出现倒数第2次出现"-"的中间这些字符中,再找倒数第1次出现"-"的索引y。

str.find("-")+1 从第1次出现"-"的索引z的下一个位置开始。