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]
时,你试图得到reqPerIndx
的0
th元素,它是一个整数,但是当然没有“整数的第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)