Python: проверка формата заголовка - PullRequest
2 голосов
/ 15 декабря 2009

Я новичок в 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 ]

6 голосов
/ 15 декабря 2009

Хорошо, несколько вещей.

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

4 голосов
/ 15 декабря 2009

как-то так (линии - это список всех строк по порядку):

import re
if re.match(r'p wncf \d+ \d+ \d+', lines[0]) == None:
    print "Bad format"
2 голосов
/ 15 декабря 2009

Вы можете вместо этого использовать p.match(line). Вы передаете первый символ строки в регулярное выражение, а не всю строку.

1 голос
/ 15 декабря 2009

вам не нужно регулярное выражение, чтобы сделать это. вот один из способов проверить заголовок.

fh=open("file")
header=fh.readline().rstrip()
if not header.startswith("p wncf") :
    print "error"
header=header.split()
if len(header) != 5:
    print "error"
if False in map(str.isdigit, header[2:]):
    print "Error"
fh.close()
1 голос
/ 15 декабря 2009
p, wncf, nvar, nclauses, hard = line.split()
nvar = int(nvar)
nclauses = int(nclauses)
hard = int(hard)
0 голосов
/ 15 декабря 2009

Использование регулярных выражений было бы самым простым способом проверить этот заголовок: -

import re
p = re.compile('p wncf \d+ \d+ \d+$')
if p.match(lineToBeChecked) == None:
  print "Header does not have correct format"

Обратите внимание на использование конечного $ в регулярном выражении для привязки регулярного выражения к концу строки и защиты от дополнительной информации, включаемой в строку заголовка (что, как я предполагал, сделает ее недействительной).

Если между параметрами допустимо произвольное количество пробелов, регулярное выражение можно изменить на следующее: -

p = re.compile('p[ ]+wncf[ ]+\d+[ ]+\d+[ ]+\d+$')
...