2012-04-29 98 views
2

Python的标记化将所有找到的标记的位置作为(startRow,startCol)和(endRow,endCol)的两个元组返回。Python标记化:标记位置

有没有办法将位置作为从字符串开始处的偏移量返回?也就是说,我想摆脱(行,列)而只是“偏移”。

回答

1

没有一个内置到tokenize

如果您有权访问由标记器使用的相同行集,则可以运行并将累积的“行X之前的行的总长度”存储到列表中,然后使用它来转换行值转换为附加偏移量。

例如:

import tokenize 

def tokens_with_offset(path): 
    line_offsets = [] 
    line_offset_accum = 0 
    with open(path) as f: 
     for line in f: 
      line_offsets.append(line_offset_accum) 
      line_offset_accum += len(line) 

    with open(path) as f: 
     for ttype, tstring, tbegin, tend, tline in tokenize.generate_tokens(f.readline): 
      offset_begin = line_offsets[tbegin[0]] + tbegin[1] 
      offset_end = line_offsets[tend[0]] + tend[1] 
      yield ttype, tstring, offset_begin, offset_end, tline 

(注:没有测试此代码,它更是一般概念的一个例子)

+0

处理文本两次是一个不走我,但我接受了答案,因为我特别要求标记化。如果你可以想办法让它在没有预处理的情况下返回偏移量,如果你在这里发布它,我会很感激。 –

+0

嗯,你不一定要处理它两次 - 你可以在文件中创建一个包装器来记录线偏移,因为它首先被读取(然后将线传递给generate_tokens)。用2遍过程编写示例更容易。 :) – Amber

+0

但'generate_tokens'不返回正在处理的行。所以你不得不知道你前进到下一行并将长度线添加到偏移量,对吗?也就是说,你必须找到两次换行符 - 一次在'generate_tokens'中,另一次在这个偏移累加器中。 –