如何用约束切割python中的特定字符?

时间:2015-04-02 11:42:11

标签: python string character slice

str="class computer :"
name=str[str.find("class"):str.find(":")]
print name

上面的代码必须输出" computer "的结果,我得到"class computer"。可能是什么错误?

3 个答案:

答案 0 :(得分:3)

一旦.find('class'),您需要将该索引与字符串'class'本身的长度相对应。

>>> s = 'class computer :'
>>> s[s.find('class')+len('class'):s.find(':')]
' computer '

您可以使用strip删除前导空格和尾随空格

>>> s[s.find("class")+len('class'):s.find(":")].strip()
'computer'

答案 1 :(得分:2)

str.find返回第一个出现的字符匹配的索引,因此返回0

>>> s.find('class')
0

来自docs

  

在找到substring sub的字符串中返回最低索引

因此,您需要使用len函数添加find字符串的长度以获得正确的输出

>>> name=s[s.find("class")+len('class'):s.find(":")]
>>> print name
 computer 

注意 - 您不应将str用作变量,因为它会影响内置功能

答案 2 :(得分:1)

如果您在其中包含任何其他单词,则您的查找将失败,您可以使用带有字边界的正则表达式来查找单词class的完全匹配:

import  re

print(re.findall(r"(?<=\bclass\b)\s+\w+\s+",s))

您可以看到它将如何失败的示例:

In [9]: s = "subclass class computer :"

In [10]: s[s.find('class')+len('class'):s.find(':')]
Out[10]: ' class computer '

In [11]: re.findall(r"(?<=\bclass\b)\s+\w+\s+",s)
Out[11]: [' computer ']

如果你的字符串中有多个class,你可以使用lookbehind断言的前瞻:

 s = "subclass class tv class computer :"
 print(re.findall(r"(?<=\bclass\b)\s+\w+\s+(?=:)",s))

 [' computer ']