为什么Python的re模块不能在这个方法中工作?

时间:2012-06-19 21:08:24

标签: python class methods

我在使用Python的re模块创建类的实例时遇到了麻烦。这就是我想要做的事情:

  1. 遍历许多数据文件的每一行。
  2. 如果一行与记录的格式匹配,则创建一个Record类的实例,并将记录的两个值作为属性。
  3. 我希望以下代码片段能够在re方法中为记录类打印由terminal()模块捕获的五个大写字母的字符串,但显然我误解了一些东西。实际输出位于代码下方。

        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的经验非常明显。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

你的意思是写

if recordline.match(self.name):

而不是

if recordline.match(self):

当您致电re.match时,您应该使用字符串进行调用。 self不是字符串,而是Record对象,而self.name是行中设置的字符串

          self.name = which

还有两个与您的其他问题相关的基本问题。

  1. 你永远不会使用行本身l,这就是你遍历文件的全部原因。也许你打算写Record(l)

  2. 为什么Record类继承SourceFile对象(代码为class Record(SourceFile)?)你应该仔细阅读inheritance:继承用于共享方法和属性在多个对象之间,它并不真正适用于此代码。