2012-06-19 37 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

每个人都从初学者开始! –

相关问题