-1

我试过调试这个脚本,但我不确定是什么导致了错误。

list1 = ['<p>Text ([0-9]):(.*)</p>' ,'<p>Text2 ([0-9]):(.*)</p>','<p>Text ([0-9]):(.*)</p>']
list2 = ["<p class='text'>Text \1:\2</p>" ,"<p class='text'>Text \1:\2</p>","<p class='text'>TEXT ([0-9]):(.*)</p>"]
translation = dict(zip(list1, list2))


pattern = re.compile('(%s)' % '|'.join(dicts.list1))
file.close()
file = open(args.file,'r+')
def translate(match):
    return dicts.translation[match.group(0)] 
with open(args.file, 'r+') as output:
        with open(args.file, 'r+') as book:
            for line in book:
                output.write(pattern.sub(translate, line))

错误:

    return dicts.translation5[match.group(0)]
KeyError: '<p>Text 1:1-1</p>'
4

3 回答 3

1

问题是文本'<p>Text 1:1-1</p>'不是您的字典中的关键。正如dicts您的代码中的自由变量一样,我们无法告诉您更多信息。

于 2013-07-18T16:36:30.670 回答
1

我相信您正在尝试匹配读取行并查看它匹配的正则表达式,以便您可以对其应用适当的更改(也以正则表达式形式)。这种方法可能有效,但在这种情况下使用字典是多余的。

广泛的方法是

  1. 您匹配要编译的行pattern以找到匹配项。
  2. 然后将每个模式list1与匹配的字符串进行比较以查看它是否
    匹配。
  3. 如果是,则将匹配的字符串转换为list2

就像是

list1 = ['<p>Text ([0-9]):(.*)</p>' ,'<p>Text2 ([0-9]):(.*)</p>','<p>Text3 ([0-9]):(.*)</p>']
list2 = ["<p class='text'>Text \1:\2</p>" ,"<p class='text'>Text \1:\2</p>","<p class='text'>TEXT ([0-9]):(.*)</p>"]
translation = dict(zip(list1, list2))
pattern = re.compile('(%s)' % '|'.join(dicts.list1))

def translate(m): 
    for x,v in translation.items(): 
        if re.search(x,m.group()): 
            return re.sub(x,v,m.group())

for line in book:
    m = pattern.findall(line)
    ret = translate(m)
    if ret is not None: 
        output.write(ret)
    else: 
        #No match. Echo back original line
        output.write(line)

输入

<p>Text 1:1-1</p>

输出

<p class='text'>Text 1:1-1</p>

可能还有其他更好的方法来做到这一点

于 2013-07-18T17:29:16.173 回答
0

尝试 match.group(1) 代替。在正则表达式结果中,group(0) 是整个匹配的字符串,组 1 和以下是正则表达式本身中的组。在您的情况下 group(0) =="<p>Text 1:1-1\</p\>"和 group(1) == "1"

于 2013-07-18T16:47:00.730 回答