Python: 检查头格式
我刚开始学Python,需要帮忙解决一个问题。基本上,我需要打开一个文件并读取它,这个我没问题。问题出现在第0行,我需要检查一下文件的头部格式。
头部的格式需要是:p wncf nvar nclauses hard
,其中'nvar'、'nclauses'和'hard'都是正整数。
举个例子:
p wncf 1563 817439 186191
这就是一个有效的头部行。
这是我已经写好的代码,感谢之前有人回答的问题:
import re
filename = raw_input('Please enter the name of the WNCF file: ')
f = open(filename, 'r')
for line in f:
p = re.compile('p wncf \d+ \d+ \d+$')
if p.match(line[0]) == None:
print "incorrect format"
即使文件格式是正确的,我还是会收到格式不正确的提示。另外,能不能把这些整数赋值给一个对象呢?
提前谢谢你们的帮助。
6 个回答
2
你可能想用 p.match(line)
这个方法。因为你现在传给正则表达式的是这一行的第一个字符,而不是整行内容。
4
大概是这样的(lines 是一个按顺序排列的所有行的列表):
import re
if re.match(r'p wncf \d+ \d+ \d+', lines[0]) == None:
print "Bad format"
6
好的,有几点需要注意。
你只需要编译一次你的正则表达式。在你上面给的例子中,你对文件中的每一行都在重新编译它。
line[0]
只是每行的第一个字符。把line[0]
替换成line
,你的代码就应该能正常工作了。
要把整数赋值给一个对象,你需要把想要的部分用括号括起来。在你的例子中,可以这样做:
p = re.compile(r"p wncf (\d+) (\d+) (\d+)")
而不是用 p.match(line)
,这个会返回一个匹配对象或者 None
,你可以使用 findall
。看看下面的代码,作为你现有代码的替代。
p = re.compile(r"p wncf (\d+) (\d+) (\d+)")
for line in f:
matches = p.findall(line)
if len(matches) != 0:
print matches[0][0], matches[0][1], matches[0][2]
else:
print "No matches."
补充:如果你的表头值也可能包含负数,你应该把 r"p wncf (\d+) (\d+) (\d+)"
替换成 r"p wncf (-?\d+) (-?\d+) (-?\d+)"
。