Python: 检查头格式

2 投票
6 回答
2397 浏览
提问于 2025-04-15 17:01

我刚开始学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

好的,有几点需要注意。

  1. 你只需要编译一次你的正则表达式。在你上面给的例子中,你对文件中的每一行都在重新编译它。

  2. 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+)"

撰写回答