1

我在使用 Python 的 re 模块创建类的实例时遇到问题。这是我正在尝试做的事情:

  1. 循环遍历许多数据文件的每一行。
  2. 如果一行与记录的格式匹配,则使用记录的两个值作为属性创建 Record 类的实例。

re我希望下面的代码片段打印模块在 Record 类的方法中捕获的五个大写字母的字符串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 的缺乏经验是相当明显的。在此先感谢您的帮助。

4

1 回答 1

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)?)您应该更仔细地阅读有关继承的内容:继承用于在多个对象之间共享方法和属性,它并不真正适用于这段代码。

于 2012-06-19T21:12:03.737 回答