我有一个平行文字。每行包含源语言(src)和目标语言(tgt)。在src和tgt中,括号之间有一些表达式。该文件看起来像这样
parallel(src('he is a [good man]'),tgt('lui è un [buon uomo]')).
parallel(src('she is a [good woman]'),tgt('lei è una donna buona')).
parallel(src('he is a beautiful man]'),tgt('lei è una bella donna')).
所以在某些行中,括号和其他行之间有表达式,括号之间没有表达式。
我想在每行旁边提取括号中的表达式和src和tgt语言中表达式的第一个单词的位置。 我试过这段代码
with open(file) as fi:
for line in fi.readlines():
src = line[12:line.index('tgt')]
tgt = line[line.index('tgt'): ]
srcs = src.split()
tgts = tgt.split()
ss = ""
tt = ""
match = re.search(r"\[(.*?)\]",src)
if match:
ss = match.group(1)
match = re.search(r"\[(.*?)\]",tgt)
if match:
tt = match.group(1)
print line, [[ss, ':', srcs.index('['+ss.split()[0])],[ tt,':', tgts.index('['+tt.split()[0])]]
它适用于括号之间有表达式的行,但对于括号之间没有表达式的行,它会给出错误“IndexError:list index out of range”
预期输出
parallel(src('he is a [good man]'),tgt('lui è un [buon uomo]')). [[good man:3][buon uomo:3]
parallel(src('she is a [good woman]'),tgt('lei è una donna buona')).[[good woman:3][]]
parallel(src('he is a beautiful man]'),tgt('lei è una bella donna')). [[]:[]]
有人可以帮忙吗?
答案 0 :(得分:1)
发生错误是因为ss.split
确实生成了0个单词的列表。简单的解决方法是:
if not ss or not tt:
print(line, "[[]:[]]")
else:
print line, [[ss, ':', srcs.index('['+ss.split()[0])],[ tt,':', tgts.index('['+tt.split()[0])]]
更复杂的解决方法是正确完成,即:
source = '[]'
match = re.search(r"\[(.*?)\]", src)
if match:
source_phrase = match.group(1)
tmp = src[:match.start()]
source_position = len(tmp.split())
source = "[{}:{}]".format(source_phrase, source_position)
target = '[]'
match = re.search(r"\[(.*?)\]", tgt)
if match:
target_phrase = match.group(1)
tmp = tgt[:match.start()]
target_position = len(tmp.split())
target = "[{}:{}]".format(target_phrase, target_position)
print line, "[{}: {}]".format(source, target)