在Python 2.7中使用unicode的re.sub 2.7
我想在文本文件中的某些藏文字符前后添加一些空格,并成功地将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
'[\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)
非常感谢!我在大多数其他替代品中使用正则表达式,所以这就是为什么我只是试图使用相同的方法。两者似乎现在工作,但如果我从终端打印python中的行,它看起来像第二个结果是错误的。如果我复制并粘贴到一些文本编辑器,我发现它非常好。我试图直接用下面的代码将结果写到文件中,但这似乎并不奏效,它只是给了我一个空文件:'output_file = codecs.open('outputtest.txt','w', 'utf-8') output_file.write(line) output_file.close()' – lothelanor
('line'是我所有替换的结果,它在不使用utf-8编码的情况下将其写入普通文件。 line = re.sub(ur'(\ u0f62 \ u0f0b | \ u0f60 \ u0f72 \ u0f0b)/ ES',ur'\ 1',line)'使用编解码器utf-8写入文件的方式,但不会 – lothelanor
这段代码看起来很好,你在将它写入文件之前是否打印了行?如果你得到一个空白文件,行必须是空的。 –
我不认为这是没有一些示例输入和预期输出应答。我的猜测是那些方括号并不是你想要的,但我无法知道你想要什么。 – jasonharper
谢谢,我现在添加了输入和输出。是的,我认为这是方括号,但我已经尝试了所有可能的替代位置,但这并没有帮助。 – lothelanor
期望的输出是什么? –