Regex 高级文本替换(完形填空删除)
嗯,我想根据文本替换特定文本,是的,听起来很有趣,就是这样 问题是如何替换以制表符分隔的值。本质上,我想做的是用Regex 高级文本替换(完形填空删除),regex,string,replace,anki,Regex,String,Replace,Anki,嗯,我想根据文本替换特定文本,是的,听起来很有趣,就是这样 问题是如何替换以制表符分隔的值。本质上,我想做的是用{…}替换句子中匹配的词汇字符串 制表符\t前的值是vocab,制表符后的值是句子。\t左边的值是第一列,右边是第二列 TL;DR版本(英文版) 基本上,我想在第一列的基础上替换第二列的文本 示例: ABCD\t 19475ABCD\u 97jdhgbl 会变成 ABCD\t 19475{…}\u 97jdhgbl ABCD是这里的第一列,19475abcd97jdhgbl是第二列
{…}
替换句子中匹配的词汇字符串
制表符\t
前的值是vocab,制表符后的值是句子。\t
左边的值是第一列,右边是第二列
TL;DR版本(英文版)
基本上,我想在第一列的基础上替换第二列的文本
示例:
ABCD\t 19475ABCD\u 97jdhgbl
会变成
ABCD\t 19475{…}\u 97jdhgbl
ABCD
是这里的第一列,19475abcd97jdhgbl
是第二列
如果您不了解下面的长版本的上下文,我可以解决这个ABCD问题。我认为这是一个相当简单的代码,但考虑到我上次用C编写代码已经有4年了,而且我最近才开始学习python,所以我不能这么做
长版本:(日语特定文本)
1.案例1:(用于纯汉字)
全部 \Tそれ、全部ください。代码>
将成为
全部 \Tそれ、{...}ください。代码>
2.案例2:(纯假名)**
ああ \Tああうるさい人は苦手です。代码>
将成为
ああ \t{…}うるさい人は苦手です。代码>
あいづち \T彼の話に私はあいづちを打ったの。代码>
将成为
あいづち \T彼の話に私は{...}を打ったの。代码>
对于case1
和case2
来说,它必须是完全匹配的,尤其是对于假名,否则它可能会替换句子中的其他假名。案例3的编码必须不同(见下一步)
3.案例3:(用于假名和汉字混合)
这是最复杂的一个。对于这一个,我希望脚本/解决方案只更改匹配的字符串,也就是说,它将忽略不匹配的内容,并仅用找到的匹配项替换这些内容。它所做的是尽可能长的匹配并相应地替换
上げる \T彼は荷物をあみだなに上げた。代码>
将成为
上げる \T彼は荷物をあみだなに{...}た。代码>
请注意,第一列有上げる代码>但第二列有上げた代码>因为它的时态已更改(第一列已更改)る 而第二个是た).
因此,理想情况下,解决方案应采用两列中最长的字符串,在本例中为上げ
,因此这是唯一一个替换为{…}
的字符串,而它离开た代码>
另一个例子
が増える \T値段がが増える代码>
将成为
が増える \T値段が{…}
更多TL;DR
我实际上是用这个来对付Anki的
我可以使用excel或记事本+,但我不认为它们可以取代基于占位符的文本
我在这里的目标是创建伪完形填空句子,我可以将其作为隐藏在提示字段中的提示,只用于难得离谱的同义词或同音词(我有一张听力卡)
我知道我漏掉了第四种情况,即纯假名,可能是一个句子的时态发生了变化,从而导致了它的拼写。好吧,这真的很难编码,所以我宁愿手动编写,以免搞乱句子中的另一个假名。
更新
我忘了说文本包含在.txt文件中,格式如下:
全部 \Tそれ、全部ください。
ああ \Tああうるさい人は苦手です。
あいづち \T彼の話に私はあいづちを打ったの。
上げる \T彼は荷物をあみだなに上げた。
这些东西大约有7000行,所以它必须检查每行的替换件。
代码可以工作,谢谢,只是一个包含非完整替换的句子的小错误,它会创建断字符。
上げたxxxx 彼は荷物をあみだなに上げあ。
ABCD ABCD123
86876 xx86876h897
全部 それ、全部ください
ああ ああうるさい人は苦手です。
上げたxxxx 彼は荷物をあみだなに上げあ。
務める ああうるさい人は苦手で務めす。
務める ああうるさい務めす人は苦手で。
变成:
只是为了测试的目的编辑了一下James的代码(我使用这个编辑过的版本来检查什么样的字符串会抛出代码)。
到目前为止,我发现词汇表中的空格可能会引起一些麻烦
此代码打印解析行下方的原始行。
只需更改此行:
fout.写入(输出)
对此
fout.write(output+str(line)+'\n')
此正则表达式应处理您正在查找的情况(包括匹配第一列中可能最长的模式):
^(\S+)(\S*?)\S+(\S*?(\1)\S*?)$
然后,您可以继续使用匹配组来进行所需的特定替换。以下是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)
.听起来似乎是使用正则表达式的合理场所,尽管我不确定您是否在寻找编程解决方案。我也在考虑正则表达式,但我不确定它是否可以完成这项工作。老实说,我更喜欢编程解决方案,但正则表达式很好。我忘了提到vocab语句对在一个文本文件中,具有1 p每条线路的空气流量(见更新后的帖子)。顺便说一句,我正在使用python 2.7。另外,我如何格式化它以使其打开文本文件,我已经尝试使用sys import argv的,open
和write
,但是编译器给了我错误。是的,我对python真的很不熟悉。@poly_purple我相应地更新了我的答案,尽管它没有经过测试。谢谢代码是完美的,除了出于某些原因,出现了断字符(请参阅更新的帖子)。我已经尝试添加了#-*-编码:utf-8-*-
,但没有