python字符串操作,在字符串中查找子字符串[重复]

Posted

技术标签:

【中文标题】python字符串操作,在字符串中查找子字符串[重复]【英文标题】:python string manipulation, finding a substring within a string [duplicate] 【发布时间】:2014-02-27 08:44:39 【问题描述】:

我正在尝试在 python 中的较大字符串中查找子字符串。我试图在找到字符串“每秒请求数:”后找到文本。似乎我对python字符串和python的一般知识缺乏。

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

代码

#output contains the string reqPerStr.
reqPerStr = "Requests per second:"
reqPerIndx = output.find(reqPerStr)
minusStuffBeforeReqPer = output[reqPerIndx[0], len(output)]
eolIndx = minusStuffBeforeReqPer.find("\n")
semiColIndx = minusStuffBeforeReqPer.find(":")
instanceTestObj.reqPerSec = minusStuffBeforeReqPer[semiColIndx+1, eolIndx]

【问题讨论】:

我觉得这不是最好的方法。如果您尝试查找出现在已知子字符串之后的子字符串,则应使用正则表达式查找。 find() 方法返回一个表示索引的整数。您正在尝试 reqPerIndx[0],这没有任何意义。 如果您在此页面上查看问题的右侧,您将看到相关问题的列。其中一些有你寻求的答案。当你写你的问题时,同样的列表会出现。 【参考方案1】:

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

minusStuffBeforeReqPer = output[reqPerIndx:len(output)]

但是,这是多余的。所以你应该这样做:

minusStuffBeforeReqPer = output[reqPerIndx:]

通过省略切片的end 部分,切片将一直到output 的末尾。


您在访问没有[0] 的元组时收到错误,因为您已将一个元组(即(reqPerIndx, len(output)) 传递给切片[...]),并且您收到有关int 没有__getitem__ 的错误,因为当你写reqPerIndx[0]时,你试图得到reqPerIndx0th元素,它是一个整数,但是当然没有“整数的第0个元素”这样的东西,因为整数没有有元素。


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

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

使用正则表达式可能会更好。我不知道 output 是什么样子,所以我只是猜测 - 你应该调整它以匹配你在 output 中的任何内容。

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

【讨论】:

请注意,str.find 会为丢失的子字符串返回 -1,这也应该被处理。 @AshwiniChaudhary 注意,谢谢。 我从没想过使用正则表达式,我不是很精通它。但是给定的正则表达式代码,它是如何读取的(查找字符串“”并返回..)? 看看regex101.com/r/aX9yI6 - 它可能会有所帮助。基本上,(?:...) 的意思是“寻找... 但不捕获它(即在输出中返回它)”。 \s* 表示“查找任意数量的空白”。最后,(\d+) 的意思是“查找一个或多个数字,并捕获它(即在输出中返回它)”。【参考方案2】:

这两行有错误:

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

您必须使用: 来创建范围。 start:end.

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

minusStuffBeforeReqPer = output[-1:]

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

你应该有如下代码:

#output contains the string reqPerStr.
reqPerStr = "Requests per second:"
reqPerIndx = output.find(reqPerStr)
if reqPerIndx != -1:
    minusStuffBeforeReqPer = output[reqPerIndx[0]:]
    eolIndx = minusStuffBeforeReqPer.find("\n")
    semiColIndx = minusStuffBeforeReqPer.find(":")

    if eolIndx > semiColIndx >= 0:

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

这很好,但是您绝对应该使用正则表达式更改代码。据我了解,您确实想匹配以reqPerStr 开头并以\n 结尾的字符串,并获取介于:\n 之间的所有内容。

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

"Requests per second:(.*)\n"

你最终会得到:

import re

reqPerIndx = output.find(reqPerStr)

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

如果要查找所有匹配项,可以这样做:

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

【讨论】:

以上是关于python字符串操作,在字符串中查找子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在字符串列表中查找字符串中第一个字母的位置(Python 3)

通过Python中的正则表达式优化在两个列表之间查找匹配子字符串

Python入门教程第82篇 常用字符串方法之查找子串

Python API快餐教程(1) - 字符串查找API

python中查找 字符串 中的 多个子串

python 查找字符串中的子字符串