检查字符串是否以Python中

时间:2015-11-06 18:54:44

标签: string python-3.x set

我想在读取文件时抛出标题行。标题行以一组有限的字符串开头,但我不能在任何地方检查子字符串,因为有效的内容行可能会在字符串的后面包含一个关键字。

我无法弄清楚如何对一组子串执行line.startswith(" substring"),这是我的第一次尝试。我的意思是,我可以把它放在一个单独的部分,并根据它设置一个变量,但这是粗略的。我只想运行逻辑测试并做出相应的响应。

我已尝试过以下几种变体,因为我有很多已知的4字符开头子串,但我很确定我的语法错误,错误,错误。它解析,但它不会拒绝任何行。

cleanLines = []
line = "sample input here"
if not line[0:3] in ["node", "path", "Path"]:  #skip standard headers
    cleanLines.append(line)

1 个答案:

答案 0 :(得分:2)

你的问题源于字符串切片不包括停止索引:

In [7]: line = '0123456789'

In [8]: line[0:3]
Out[8]: '012'

In [9]: line[0:4]
Out[9]: '0123'

In [10]: line[:3]
Out[10]: '012'

In [11]: line[:4]
Out[11]: '0123'

ij之间切换字符串会返回从i开始,到(但不包括)j结束的子字符串。

只是为了让您的代码运行得更快,您可能希望测试集合中的成员资格,而不是列表:

cleanLines = []
line = "sample input here"
blacklist = set(["node", "path", "Path"])
if line[:4] not in blacklist:  #skip standard headers
    cleanLines.append(line)

现在,您对该代码实际执行的操作是startswith,不受任何长度参数的限制:

In [12]: line = '0123456789'

In [13]: line.startswith('0')
Out[13]: True

In [14]: line.startswith('0123')
Out[14]: True

In [15]: line.startswith('03')
Out[15]: False

所以你可以这样做来排除标题:

cleanLines = []
line = "sample input here"
headers = ["node", "path", "Path"]
if not any(line.startswith(header) for header in headers) :  #skip standard headers
    cleanLines.append(line)