有没有办法实现这个搜索和替换功能?

2024-06-17 10:00:18 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有一个视频游戏脚本,由俄语代码和语音线(用背景音表示)组成:

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个语音线


Tags: the脚本游戏视频语音nan背景文本文件
2条回答

由于您说过两个列表的顺序相同,因此可以使用zip并行迭代它们:

result = []

for russian, english in zip(russian_list, english_list):
    result.append(some_regex.sub(english, russian))

您只需要计算出some_regex需要是什么,以便捕获反勾号之间的第一次出现,等等。 提示:在repl中开发这样的东西很容易

使用regex并使用文件是迭代器这一事实,可以最轻松地完成这一点:

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:

相关问题 更多 >