Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 高级文本替换(完形填空删除)_Regex_String_Replace_Anki - Fatal编程技术网

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-*-
,但没有