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

时间:2015-07-23 10:42:20

标签: regex string replace anki

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

问题是如何替换制表符分隔值。基本上,我想做的是用{...}替换句子上的匹配词汇串。

选项卡\t之前的值是词汇,选项卡之后的值是句子。 \t左侧的值是第一列,右侧是第二列

<小时/> TL; DR版本(英文版)
基本上,我想基于第一列替换第二列上的文本。

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

ABCD是此处的第一列,19475ABCD_97jdhgbl是第二列。

如果你没有得到下面的Long版本的上下文,解决这个ABCD问题对我来说没问题。我认为这是一个非常简单的代码,但考虑到我上次用C语言编写已经有4年了,我最近才开始学习python,我不能这样做。

<小时/> 长版本:(日文专用文字)
1。案例1 :(纯粹的汉字)
全部 \t それ、全部ください。
会成为 全部 \t それ、{...}ください。

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

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

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

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

请注意,第一列有上げる,但第二列有上げた,因为它在时态上已更改(第一列有る而第二列有た)。

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

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

更多TL; DR

我实际上是将它用于Anki。

我可以使用excel或notepad ++,但我认为他们不能替换基于占位符的文本。

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

我知道我错过了第四个案例,即纯粹的假名,可能会有一个句子改变了它的时态,因此拼写错误。嗯,这真的很难编码,所以我宁愿手动操作,以免弄乱句子中的其他假名。

<小时/> 的更新
我忘了说文本包含在这种格式的.txt文件中:

全部\ tそれ,全部ください ああ\ tああうるさい人は苦手です あいづち\ t彼の话に私はあいづちを打ったの。
上げる\ t彼は荷物をあみだなに上げた。

这些东西大约有7000行,因此必须检查每行的替换。

<小时/> 代码工作,谢谢,只是一个小错误的句子,包括非完全替换,它创建破碎的字符。

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

变成:

enter image description here

<小时/> 刚刚编辑了James的代码用于测试目的(我正在使用这个编辑版本来检查哪种字符串会丢掉代码。 到目前为止,我发现词汇表中的空格可能会造成一些麻烦。

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

1 个答案:

答案 0 :(得分:1)

这个正则表达式应该处理你正在寻找的案例(包括匹配第一列中最长的模式):

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

Regex demo here

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

import re

regex = re.compile(r'^(\S+)(\S*?)\s+?(\S*?(\1)\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

相关问题