python字符串操作,在字符串中查找子字符串

python string manipulation, finding a substring within a string

本问题已经有最佳答案,请猛点这里访问。

我试图在Python中的较大字符串中找到一个子字符串。我试图找到字符串"每秒请求数:"后的文本。似乎我对python字符串和python的一般知识是缺乏的。

我的错误是在代码的第3行minusStuffBeforeReqPer = output[reqPerIndx[0], len(output)]上,我得到了这样的错误:没有[0]在reqperindx上,我试图访问一个元组,但有了它,我得到了错误,我int object has no attribute __getitem__。我试图在output字符串中找到reqperstr开头的索引。

代码

1
2
3
4
5
6
7
8
#output contains the string reqPerStr.
reqPerStr ="Requests per second:"
reqPerIndx = output.find(reqPerStr)
minusStuffBeforeReqPer = output[reqPerIndx[0], len(output)]
eolIndx = minusStuffBeforeReqPer.find("
"
)
semiColIndx = minusStuffBeforeReqPer.find(":")
instanceTestObj.reqPerSec = minusStuffBeforeReqPer[semiColIndx+1, eolIndx]


您必须使用output[begin:end],而不是output[begin, end](这正是划分普通字符串/列表等的语法的工作方式)。所以:

1
minusStuffBeforeReqPer = output[reqPerIndx:len(output)]

然而,这是多余的。所以你应该做的是:

1
minusStuffBeforeReqPer = output[reqPerIndx:]

通过省略片的end部分,片将一直延伸到output的末端。

在没有[0]的情况下访问一个元组会出错,因为您已经将一个元组(即(reqPerIndx, len(output))传递给切片的[...],而在没有__getitem__的情况下访问int会出错,因为在编写reqPerIndx[0]时,您试图获取reqPerIndx0第个元素,这是一个整数,但是当然,没有"整数的第0个元素"这样的东西,因为整数没有元素。

正如@ashwinichaudhary在评论中指出的那样,如果没有找到子字符串,str.find将返回-1。如果你确信你要找的东西总是在output的某个地方找到,我想你不需要处理-1案件,但无论如何这样做可能是个好主意。

1
2
3
4
5
6
reqPerIndx = output.find(reqPerStr)
if reqPerIndx != -1:
    minusStuffBeforeReqPer = ...
    # etc
else:
    # handle this case separately

你可能对正则表达式有更好的运气。我不知道output是什么样子,所以我猜你应该调整它来匹配你在output中拥有的东西。

1
2
3
4
5
>>> import re
>>> re.findall(r'(?:Requests per second:)\s*(\d+)',"Requests: 24")
[]
>>> re.findall(r'(?:Requests per second:)\s*(\d+)',"Requests per second: 24")
['24']


这两行有错误:

1
2
minusStuffBeforeReqPer = output[reqPerIndx[0], len(output)]
instanceTestObj.reqPerSec = minusStuffBeforeReqPer[semiColIndx+1, eolIndx]

您必须使用:创建一个范围。start:end

可以省略最后一个参数以到达结尾,也可以省略第一个参数以省略开头。参数也可以是负数。由于find可能返回-1,因此您必须以不同的方式处理它,因为如果找不到字符串,您将得到:

1
minusStuffBeforeReqPer = output[-1:]

这是字符串中的最后一个字符。

您应该有这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
#output contains the string reqPerStr.
reqPerStr ="Requests per second:"
reqPerIndx = output.find(reqPerStr)
if reqPerIndx != -1:
    minusStuffBeforeReqPer = output[reqPerIndx[0]:]
    eolIndx = minusStuffBeforeReqPer.find("
"
)
    semiColIndx = minusStuffBeforeReqPer.find(":")

    if eolIndx > semiColIndx >= 0:

        instanceTestObj.reqPerSec = minusStuffBeforeReqPer[semiColIndx+1:eolIndx]

这很好,但是,您必须用regex更改代码。据我所知,你真的想匹配一个以reqPerStr开头,以
结尾的字符串,得到:
之间的所有内容。

你可以用这样的模式来做到:

1
2
"Requests per second:(.*)
"

你最终会得到:

1
2
3
4
5
6
7
8
import re

reqPerIndx = output.find(reqPerStr)

match = re.match("Requests per second:(.*)
"
, output)
if match:
    instanceTestObj.reqPerSec = match.group(1)

如果要查找所有匹配项,可以执行以下操作:

1
2
for match in re.finditer("Requests per second:(.*)", output)
    instanceTestObj.reqPerSec = match.group(1)