2013-07-18 150 views
-1

我試着調試這個劇本,但我不知道啥子是造成錯誤。KeyError異常在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

這不是正則表達式。 'dicts.translation'沒有'

Text 1:1-1

'鍵。 – mishik

+0

應該包括完整的回溯。 – Marcin

+0

我該如何讓列表充當RE? –

回答

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> 

可能有其他更好的方式

+0

這正是我所需要的。 –

1

的問題是,文本'<p>Text 1:1-1</p>'是不是在你的字典的關鍵。由於dicts是您代碼中的自由變量,因此我們無法告訴您的更多信息。

0

請嘗試使用match.group(1)。在正則表達式結果中,組(0)是整個匹配的字符串,而組1和以下是正則表達式本身中的組。在你的病例組(0)== "<p>Text 1:1-1\</p\>"和組(1)== "1"

+0

我把match.group(0)切換到了match.group(1),它沒有解決問題。 –

+0

它仍然返回'KeyError:'

Text 1:1-1

''? – tdelaney

+0

我無法弄清楚你的腳本應該這樣做只是提供匹配的修復。我可能不應該跳入這裏! – tdelaney