2017-02-25 150 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

这段代码看起来很好,你在将它写入文件之前是否打印了行?如果你得到一个空白文件,行必须是空的。 –