尝试从文本文件中提取有用的信息块

3
我正在尝试使用字符串切片从文本文件中提取某个表的所有出现次数,但它一直重复地提取第一个切片。也许我需要一个虚拟变量来计算起始和结束次数?
result = ''  
start = 'start of stuff I want'  
end = 'end of stuff I want'  
otn = o.read()  
count = otn.count(start)  
s = 0  
e = 0  
for i in range(count):  
    s = otn.find(start, s)  
    e = otn.find(end, s)  
    result = result + otn[s:e]  
print(result)  

有什么建议吗?


查看查找后 s 和 e 的值。 - mmmmmm
o只是我要打开的文件。 - Boogle
3个回答

2

试试这个。它更符合Python风格,而且可重用:

def extract_delimited_data(data, begin_delimiter, end_delimiter):
    s = data.find(begin_delimiter)

    while s != -1:
        e = data.find(end_delimiter, s + len(begin_delimiter))

        s += len(begin_delimiter)
        yield data[s:e]

        s = data.find(begin_delimiter, e + len(end_delimiter))

data = 'foo<bar>hello<world>'

print list(extract_delimited_data(data, '<', '>'))

输出:

['bar', 'world']

@cwallenpoole:我无法解析那个句子。 - cdhowie
@cwallenpoole:是的,我忽略了长度的考虑。 - cdhowie
不要使用 while s != -1: s += 1,你可能想要使用 while s != -1: s += len(begin_delimiter) - cwallenpoole
我在谈论这个:“对于那些不够酷到能用Py3k的人,你们将不得不在'while'之前附加一个已定义的字符串s,而不是使用yield。” 我不知道你试图传达什么意思。 - cdhowie
NM。我大部分时间都在使用Python 3,并且一直以为它是该版本的新功能。 - cwallenpoole
显示剩余2条评论

1

我认为find函数的第二个参数应该是s + 1。find函数会在给定索引处或之后找到匹配项,因此如果给定的索引指向一个匹配项,它将再次找到它。

因此,s的初始值应该为-1。


0

我想你的意思是

for i in range(count):  
    s = otn.find(start, e)  #start looking after the end of the previous data
    e = otn.find(end, s)    #start looking after the above beginning
    result = result + otn[s:e] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接