python - 为什么 Python 的 re 模块在这个方法中不起作用?

标签 python class methods

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

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

我希望下面的代码片段在 Record 类的 terminal() 方法中打印由 re 模块捕获的五个大写字母的字符串,但显然我误会了什么。实际输出如下代码所示。

    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 缺乏经验是显而易见的。预先感谢您的帮助。

最佳答案

你的意思是写

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 应该仔细阅读: 继承用于在多个对象之间共享方法和属性,它并不真正适用于此代码。

关于python - 为什么 Python 的 re 模块在这个方法中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11109458/

相关文章:

python - dict.keys() 返回的键 k 在执行 dict[k] : KeyError on existing key 时导致 KeyError

php - Web 浏览器未返回任何内容 - 功能错误?

Java在Main类中调用方法

sql - 如何从一个 cfc 文件中的函数查询中调用另一个 CFC 文件中的函数?

javascript - 访问在 AJAX 函数中设置值的变量

python - 汉诺塔 - 用 Python 解决中途算法

python - 从数字和字母列表中删除字母

python - 如何将此代码从 matlab 转换为 python?

php - 如何 "invoke"在 PHP 中的类实例?

c# - 如何在 C# 中自动命名实例?