如果我有一个由俄语代码和语音(用反引号表示)混合组成的视频游戏脚本:
d [lv 0*"19"*"11900001"]`"............Вы...`[@][lv 0*"19"*"11900002"]`снова стали злоупотреблять алкоголем, не так ли?"`[\]
lss s0_8,"nan","a1_fumu1" ;1
aspt2 xpos,s0_8,-370
flush 10,167
msgwnd_non
*d2
d `Пожилой врач, вздохнув, убрал стетоскоп.`[\]
*d3
d `В мрачном кабинете, в воздухе которого смешались пыль и тошнотворно‐приторный запах, можно было увидеть двух пожилых мужчин.`[\]
textoff
waits 167
csp_slot s0_8
lbg s0_1,"mlib_1b_bg"
lbg s0_3,"mlib_1b"
flush 24
*d4
d `В углу этой комнаты, намного более просторной, чем обычный кабинет,`[@]` стояла дорогая кровать, на которой находился человек, проходящий медицинское обследование, а рядом — его врач.`[@]`{n}Также в кабинете находился ещё один человек, походивший на слугу и молча наблюдавший за процессом.`[\]
lss s0_10,"kin","a11_defo1" ;1
aspt2 xpos,s0_10,370
flush 10,167
msgwnd_kin
*d5
d [lv 0*"01"*"11500001"]`"Спиртное — мой друг.`[@][lv 0*"01"*"11500002"]` Для меня оно не меньший друг, чем ты, да и пробыло оно со мной гораздо дольше тебя."`[\]
msgwnd_non
*d6
d `Непоколебимым тоном заявил человек, на груди которого секунду назад был стетоскоп, поправляя одежду.`[\]
lss s0_8,"nan","a1_komaru3" ;1
aspt2 xpos,s0_8,-370
flush 10,167
msgwnd_nan
*d7
以及带有英文翻译的文本文档,仅由语音线(也用反引号分隔)组成,没有代码:
`"............You've...`
`been indulging in alcohol again, haven't you?"`
`The old physician let out a sigh as he removed the stethoscope.`
`Two elderly men could be seen in the dimly lit study, which was filled with dust and a sickly sweet stench.`
`In the corner of this room, which was much larger than what most people would call a study,`
` there was an expensive‐looking bed, a man undergoing a medical examination, and the physician conducting it.`
`{n}There was also what appeared to be a servant watching over the whole scene.`
`"The bottle is my friend.`
` It is no less of a friend than you, and it has stood by my side even longer than you have."`
`The man who had bared his chest for the stethoscope spoke unapologetically as he straightened out his clothes.`
如果前面提到的俄罗斯电子游戏脚本是一个由数十万行文本和数万条语音组成的文本文件,而我有一个仅由这些语音组成的相应英文成绩单(也是一个文本文件),是否会我有可能以一种有效的方式简单地将电子游戏脚本中的每个俄语语音替换为相应的英语语音吗?
PS:这两个文件中的行以相同的顺序出现。因此,脚本中反引号中的第一条俄语语音 ("............Вы...
) 对应于英文抄本 ("............You've...
) 中的第一条语音。第一个文件中的每第 n 个语音线对应于第二个文件中的第 n 个语音线。
答案 0 :(得分:1)
既然您说两个列表的顺序相同,您可以使用 zip
并行迭代它们:
result = []
for russian, english in zip(russian_list, english_list):
result.append(some_regex.sub(english, russian))
您只需要计算出 some_regex
需要是什么,以便捕获反引号之间的第一次出现等。
提示:在repl中开发这样的东西很容易。
答案 1 :(得分:1)
使用正则表达式并使用文件是迭代器这一事实最容易做到这一点:
import re
with open("russian.txt") as russian, open("english.txt") as english, open("new.txt", 'w') as res:
for line in russian:
res.write(re.sub(r"`[^`]*`", lambda match: next(english).strip(), line))
该模式将匹配所有反引号及其内部的所有内容 - see the demo。
然后使用一个函数完成替换,该函数采用翻译的下一行,从而确保它与原文匹配。
您可能需要稍微调整一下文件的编码以使其正确。我能够让它工作:
with open("test.txt", encoding='windows-1251') as russian, open("output.txt", encoding='utf8') as english, open("new.txt", 'w', encoding='utf8') as res: