2012-04-29 95 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'中,另一次在這個偏移累加器中。 –