Python脚本中的KeyError

时间:2013-07-18 16:32:53

标签: python

我已尝试调试此脚本,但我不确定是否导致错误。

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>'

3 个答案:

答案 0 :(得分:1)

问题是文字'<p>Text 1:1-1</p>'不是你词典中的关键词。由于dicts是代码中的自由变量,因此我们无法告诉您。

答案 1 :(得分:1)

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

广泛的方法是

  1. 您将该行与已编译的pattern匹配以查找匹配项。
  2. 然后将list1中的每个模式与匹配的字符串进行比较,看是否为蓝色 火柴。
  3. 如果是,您将匹配的字符串转换为list2
  4. 中的表单

    这样的东西
    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>
    

    可能还有其他更好的方法

答案 2 :(得分:0)

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