我想在文本文件中的一些藏文字符之前和之后添加一些空格,并成功地使用re.sub()来替换同一文件中所有普通字符的多行。如果我为藏文字符的一行re.sub替换做同样的事情,它也可以工作,无论哪个字符(所以所有unicode序列都是正确的)。但是,如果我为藏文字符尝试多行re.sub(),它会找到所有正确的字符串,但用错误的字符串(第一行的字符串)替换它。这是我的代码的相关部分(我使用Python 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&#39;而不是应该是什么。任何建议都非常感谢!
这是我得到的输出样本(只关注西藏线):
པརར་སཱའིར་འདུལ་// Xབ་/ Eག་/ Sབཞུགས་/ Sསོ/ S་。/ S
这是输入测试文件的第一行:
པར་/ESསཱསཱི/ESའདུལ་//Xབ་/Eག་/Sབཞུགས་/Sསོ/S་./S
第一个单词正确,但第二个单词错误,分别表示unicode re.sub的第一行和第二行。所需的输出如下,前两个单词的最后一个字符周围有空格,因为它们有一个/ ES标记:
པར་སཱིའདུལ་// Xབ་/ Eག་/ Sབཞུགས་/ Sསོ/ S་。/ S
答案 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)