高级文本替换(完形填空)

Advanced text replacement (cloze deletion)

好吧,我想根据文本替换特定的文本,是的,听起来很有趣,所以就在这里。

问题是如何替换制表符分隔值。本质上,我想做的是用 {...}.

替换句子中找到的匹配词汇字符串

制表符前的值\t是词汇,制表符后的值是句子。 \t左边的值是第一列,右边是第二列


TL;DR版本(英文版)
本质上,我想根据第一列替换第二列上的文本。

示例:
ABCD \t 19475ABCD_97jdhgbl
会变成
ABCD \t 19475{...}_97jdhgbl

ABCD 是这里的第一列,19475ABCD_97jdhgbl 是第二列。

如果您不了解下面长版的上下文,我可以解决这个 ABCD 问题。我认为这是一个非常简单的代码,但鉴于我上次用 C 编写代码已经大约 4 年了,而且我最近才开始学习 python,我做不到。


长版:(日语专用文本)
1. 案例一:(纯汉字)
全部 \t それ、全部ください。
会变成
全部 \t それ、{...}ください。

2. 案例 2:(对于纯假名)**
ああ \t ああうるさい人は苦手です。
会变成
ああ \t {...}うるさい人は苦手です。

あいづち \t 彼の話に私はあいづちを打ったの。
会变成
あいづち \t 彼の話に私は{...}を打ったの。

对于 Case 1Case 2 它必须完全匹配,尤其是对于假名,否则它可能会替换句子中的其他假名。 Case 3 的编码必须不同(见下)。

3. 案例 3:(混合假名和汉字)
这是最复杂的一个。对于这个,我希望 script/solution 只更改匹配的字符串,即它会忽略不匹配的字符串,只替换找到的匹配字符串。它所做的是需要最长的匹配并相应地替换。
上げる \t 彼は荷物をあみだなに上げた。
会变成
上げる \t 彼は荷物をあみだなに{...}た。

注意这里第一栏是上げる,但是第二栏是上げた,因为时态变了(第一栏是る,第二栏是た)。

因此,理想情况下,解决方案应采用在两列中找到的最长字符串,在本例中为 上げ,因此这是唯一被 {...} 替换的字符串,而它留下 .

另一个例子
が増える \t 値段がが増える
会变成
が増える \t 値段が{...}


更多 TL;DR

我实际上是在为 Anki 使用它。

我可以使用 excel 或 notepad++,但我认为它们无法根据占位符替换文本。

我的目标是创建伪完形填空句,我可以将其用作隐藏在提示字段中的提示,仅用于非常难的同义词或同音异义词(我有一张听觉卡)。

我知道我遗漏了第四种情况,即纯假名,句子可能会改变其时态,从而改变其拼写。好吧,这真的很难编码,所以我宁愿手动完成,以免弄乱句子中的其他假名。


更新
我忘了说文本以这种格式包含在 .txt 文件中:

全部 \t それ、全部ください。
ああ\tああうるさい人は苦手desu。
あいづち\t彼の话ニ私はあいづちを打ったの。
上げる\t彼は荷物をあみだナニ上げた。

这些东西大约有 7000 行,所以它必须检查每一行的替换。


代码有效,谢谢,只是句子的一个小错误,包括非完整替换,它会创建损坏的字符。

上げたxxxx 彼は荷物をあみだなに上げあ。
ABCD    ABCD123
86876   xx86876h897
全部  それ、全部ください
ああ  ああうるさい人は苦手です。
上げたxxxx 彼は荷物をあみだなに上げあ。
務める ああうるさい人は苦手で務めす。
務める ああうるさい務めす人は苦手で。

变成:


只是出于测试目的对 James 的代码进行了一些编辑(我正在使用这个编辑过的版本来检查什么样的字符串会导致代码丢失。 到目前为止,我发现词汇表中的空格可能会造成一些麻烦。

此代码在解析行下方打印原始行。
只需更改此行:
fout.write(output)
对此
fout.write(output+str(line)+'\n')

此正则表达式应处理您要查找的情况(包括匹配第一列中的最长可能模式):

^(\S+)(\S*?)\s+?(\S*?()\S*?)$

Regex demo here.

然后您可以继续使用匹配组来进行您正在寻找的特定替换。这是 python 中的示例解决方案:

import re

regex = re.compile(r'^(\S+)(\S*?)\s+?(\S*?()\S*?)$')

with open('output.txt', 'w', encoding='utf-8') as fout:
    with open('file.txt', 'r', encoding='utf-8') as fin:
        for line in fin:
            match = regex.match(line)
            if match:
                hint = match.group(3).replace(match.group(1), '{...}')
                output = '{0}\t{1}\n'.format(match.group(1) + match.group(2), hint)
                fout.write(output)

Python demo here.