2
Python的標記化將所有找到的標記的位置作爲(startRow,startCol)和(endRow,endCol)的兩個元組返回。Python標記化:標記位置
有沒有辦法將位置作爲從字符串開始處的偏移量返回?也就是說,我想擺脫(行,列)而只是「偏移」。
Python的標記化將所有找到的標記的位置作爲(startRow,startCol)和(endRow,endCol)的兩個元組返回。Python標記化:標記位置
有沒有辦法將位置作爲從字符串開始處的偏移量返回?也就是說,我想擺脫(行,列)而只是「偏移」。
沒有一個內置到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
(注:沒有測試此代碼,它更是一般概念的一個例子)
處理文本兩次是一個不走我,但我接受了答案,因爲我特別要求標記化。如果你可以想辦法讓它在沒有預處理的情況下返回偏移量,如果你在這裏發佈它,我會很感激。 –
嗯,你不一定要處理它兩次 - 你可以在文件中創建一個包裝器來記錄線偏移,因爲它首先被讀取(然後將線傳遞給generate_tokens)。用2遍過程編寫示例更容易。 :) – Amber
但'generate_tokens'不返回正在處理的行。所以你不得不知道你前進到下一行並將長度線添加到偏移量,對嗎?也就是說,你必須找到兩次換行符 - 一次在'generate_tokens'中,另一次在這個偏移累加器中。 –