2012-06-19 83 views
1

我無法用Python的re模塊創建一個類的實例。以下是我想要做的:爲什麼Python的re模塊不能在這個方法中工作?

  1. 循環遍歷許多數據文件的每一行。
  2. 如果一行與記錄的格式相匹配,則創建一個Record類的實例,並將該記錄的兩個值作爲屬性。

我期待下面的代碼片段打印在了記錄類terminal()方法re模塊捕獲5個大寫字母串,但顯然我誤解的東西。實際輸出在代碼下面。

class SrcFile: 
     def __init__(self, which): 
      self.name = which  

    class Record(SrcFile):  
     def terminal(self): 
      recordline = re.compile(r"^([A-Z]{5})\s{3}") 
      if recordline.match(self): 
      m = recordline.match(self) 
      return m.group(1) 

    for f in files: 
     file = SrcFile(f) 
     for l in f: 
      record = Record(f) 
      print(record.terminal()) 

同樣,我希望看到五個大寫字母串的每個記錄行,但我實際得到的是:

Traceback (most recent call last): 
    File "./next.py", line 78, in <module> 
    print(record.terminal()) 
    File "./next.py", line 63, in terminal 
    if recordline.match(self): 
TypeError: expected string or buffer 

這也將是有益的,如果有人可以解釋,爲什麼在代碼

for f in files: 
    file = SrcFile(f) 
    for l in f: 
     record = Record(f) 

使用record = Record(file)顯然是不正確的。我通過試驗和錯誤發現了這一點,因爲我無法使用帶錯誤代碼的record.method()訪問文件的SrcFile類的方法,但我不明白爲什麼。

我敢肯定,我在編程方面的缺乏經驗,尤其是Python對於編程尤其明顯。在此先感謝您的幫助。

回答

5

你的意思是寫

if recordline.match(self.name): 

而不是

if recordline.match(self): 

當你調用re.match,你應該用繩子這樣做。 self不是字符串,而是一個Record對象,而self.name是該行設定的字符串

  self.name = which 

有一些涉及到您的其他問題兩個基本問題。

  1. 你永遠使用該行本身,l,這是你通過文件迭代的全部理由。也許你打算寫Record(l)

  2. 爲什麼記錄類繼承SourceFile對象(代碼class Record(SourceFile)?)你應該多看仔細思考inheritance:繼承是用來分享的方法和不同對象之間的屬性,它並沒有真正適用於本碼。

+0

另外,他沒有使用名爲'file'的'SrcFile'實例。 –

+0

@DavidRobinson,謝謝你指出我的錯誤;這是一個充滿了他們的一天! – Gregory

+0

每個人都從初學者開始! –

相關問題