我在使用 Python 的 re 模块创建类实例时遇到问题。这是我正在尝试做的事情:
- 遍历许多数据文件的每一行。
- 如果一行与记录的格式匹配,则创建 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
还有两个基本问题与您的其他问题相关。
l
,您永远不会使用该行本身,这就是您遍历文件的全部原因。也许您打算编写Record(l)
。为什么 Record 类会继承
SourceFile
对象(代码为class Record(SourceFile)
?)关于 inheritance 应该仔细阅读: 继承用于在多个对象之间共享方法和属性,它并不真正适用于此代码。
关于python - 为什么 Python 的 re 模块在这个方法中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11109458/