2017-02-25 202 views
0

我想在文本文件中的某些藏文字符前後添加一些空格,併成功地將re.sub()用於多行代替所有普通字符文件。如果我爲一個藏文字符的re.sub替換行做同樣的事情,它也可以工作,不管哪個字符(所有的unicode序列都是正確的)。但是,如果我爲藏文字符嘗試多行re.sub(),它會找到所有正確的字符串,但會用錯誤的字符串(第一行的字符串)替換它。這是我的代碼的相關部分(我使用Python 2.7):在Python 2.7中使用unicode的re.sub 2.7

import codecs, re, os 

text = codecs.open('test.txt', encoding='utf-8') 

def cs(text): 

    for line in text: 
     #line = re.sub('<utt>','',line) 
     #line = re.sub('//','/',line) 
     line = re.sub(ur'[\u0f62\u0f0b]/ES', ur' \u0f62\u0f0b ',line) 
     line = re.sub(ur'[\u0f60\u0f72\u0f0b]/ES', ur' \u0f60\u0f72\u0f0b ',line) 
     print line 

兩個單獨使用Unicode工作線,並給予正確的更換(雖然性格在輸出翻倍,而不是代替)。結合起來,他們發現了不同的角色,但總是用第一個''u0f62 \ u0f0b'代替它,而不是它應該是。任何建議非常感謝!

這是輸出的一個示例中,我得到(只專注於藏線):

པརར་སཱིའིར་འདུལ་// Xབ་/ Eག་/ Sབཞུགས་/ Sསོ/S་./S

這是從輸入的測試文件的第一行:

པར་/ ESསཱིའི་/ ESའདུལ་// Xབ་/ Eག་/ Sབཞུགས་/ Sསོ/S་./S

它與正確的第一個詞,但錯誤的機智h代表分別代表unicode re.sub的第一行和第二行的第二行。所期望的輸出與周圍的前兩個單詞的最後一個字符的空間下面,因爲他們有一個/ ES標記:

པར་སཱིའི་འདུལ་// Xབ་/ Eག་/ Sབཞུགས་/Sསོ/ S་./S

+1

我不認爲這是沒有一些示例輸入和預期輸出應答。我的猜測是那些方括號並不是你想要的,但我無法知道你想要什麼。 – jasonharper

+0

謝謝,我現在添加了輸入和輸出。是的,我認爲這是方括號,但我已經嘗試了所有可能的替代位置,但這並沒有幫助。 – lothelanor

+0

期望的輸出是什麼? –

回答

0

'[\u0f62\u0f0b]/ES'要匹配\u0f62/ES\u0f0b/ES,這不是你想要的。只要刪除括號。

此外,您的示例原始文本在每個/ ES之後都有一個空格,因此替換不需要添加另一個。

最後,這些似乎是簡單的替代品,所以不需要re模塊。

original = u'\u0f54\u0f62\u0f0b/ES \u0f66\u0f71\u0f72\u0f60\u0f72\u0f0b/ES \u0f60\u0f51\u0f74\u0f63\u0f0b//X \u0f56\u0f0b/E \u0f42\u0f0b/S \u0f56\u0f5e\u0f74\u0f42\u0f66\u0f0b/S \u0f66\u0f7c/S \u0f0d/S' 
desired = u'\u0f54 \u0f62\u0f0b \u0f66\u0f71\u0f72 \u0f60\u0f72\u0f0b \u0f60\u0f51\u0f74\u0f63\u0f0b//X \u0f56\u0f0b/E \u0f42\u0f0b/S \u0f56\u0f5e\u0f74\u0f42\u0f66\u0f0b/S \u0f66\u0f7c/S \u0f0d/S' 

print 'org =',original 
print 'desired =',desired 

attempt = original.replace(u'\u0f62\u0f0b/ES', u' \u0f62\u0f0b').replace(u'\u0f60\u0f72\u0f0b/ES', u' \u0f60\u0f72\u0f0b') 
print 'attempt =',attempt 
print attempt == desired 

輸出:

org = པར་/ES སཱིའི་/ES འདུལ་//X བ་/E ག་/S བཞུགས་/S སོ/S །/S 
desired = པ ར་ སཱི འི་ འདུལ་//X བ་/E ག་/S བཞུགས་/S སོ/S །/S 
attempt = པ ར་ སཱི འི་ འདུལ་//X བ་/E ག་/S བཞུགས་/S སོ/S །/S 
True 

如果你仍然想使用re模塊,下面將做一個傳過線兩種替代品。它匹配兩個序列中的一個,用空格+匹配替換匹配並刪除/ ES。

attempt = re.sub(ur'(\u0f62\u0f0b|\u0f60\u0f72\u0f0b)/ES',ur' \1',original) 
+0

非常感謝!我在大多數其他替代品中使用正則表達式,所以這就是爲什麼我只是試圖使用相同的方法。兩者似乎現在工作,但如果我從終端打印python中的行,它看起來像第二個結果是錯誤的。如果我複製並粘貼到一些文本編輯器,我發現它非常好。我試圖直接用下面的代碼將結果寫到文件中,但這似乎並不奏效,它只是給了我一個空文件:'output_file = codecs.open('outputtest.txt','w', 'utf-8') output_file.write(line) output_file.close()' – lothelanor

+0

('line'是我所有替換的結果,它在不使用utf-8編碼的情況下將其寫入普通文件。 line = re.sub(ur'(\ u0f62 \ u0f0b | \ u0f60 \ u0f72 \ u0f0b)/ ES',ur'\ 1',line)'使用編解碼器utf-8寫入文件的方式,但不會 – lothelanor

+0

這段代碼看起來很好,你在將它寫入文件之前是否打印了行?如果你得到一個空白文件,行必須是空的。 –