2009-12-14 71 views
2

我是python新手,需要幫助解決問題。基本上我需要打開一個文件並閱讀它,我可以做任何問題。問題出現在第0行,我需要檢查標題格式。Python:檢查標題格式

標題需要格式爲: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" 

我仍然得到不正確的格式,即使該文件是一個正確的格式。另外,是否可以將整數分配給一個對象?

在此先感謝。

回答

4

類似的東西(線是所有線路的順序列表):

import re 
if re.match(r'p wncf \d+ \d+ \d+', lines[0]) == None: 
    print "Bad format" 
+0

隨着這一重新假定所有字段都是由一個空格... – mkClark 2009-12-14 22:02:52

+0

@mkClark分隔的警告,這是一個假設,感謝精度:) – 2009-12-14 22:08:53

+1

雖然它的安全在這裏,比較一般來說,與「無」的平等並不是一個好主意。應該總是使用「是無」或「不是無」(使用身份比較)來代替。 (它也更快。) – 2009-12-14 22:59:23

1
p, wncf, nvar, nclauses, hard = line.split() 
nvar = int(nvar) 
nclauses = int(nclauses) 
hard = int(hard) 
+0

這將如何實施?因爲我假設標題中的數字將被分配給其相應的對象? – harpalss 2009-12-14 22:22:21

+2

這段代碼並不能防止整數被否定,它不會捕獲如果格式不匹配將會拋出的異常,也不能防止在標題行末尾存在無關信息。簡而言之,這個代碼片段只有在頭部格式正確的情況下才有效。 – 2009-12-14 22:30:59

+0

是的。它應該檢查數字是否定的,但我認爲它不應該防止例外。我認爲這個代碼有責任提供例外。也許它應該捕獲如果值不是int並引發ValueError而引發的類型錯誤。如果nvar,nclauses和hard不是正整數,我認爲提出ValueError是正確的。如果OP想要別的東西,他可以在接收的代碼中捕獲它。 – jcdyer 2009-12-15 01:27:53

0

使用正則表達式將是對最簡單的方法來檢查這個頭: -

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+$') 
+0

這裏我的腳本到目前爲止,但即時通訊仍然得到不正確的格式時,文件格式是正確的。在參數之間假設一個空間是正確的。 進口重新 文件名的raw_input =('請輸入WNCF文件的名稱: ') F =開放(文件名, 'R') 在F線:0​​P = re.compile(' P wncf \ d + \ d + \ d + $') if p.match(line [0])== None: 打印「不正確的格式」 也有可能將對象分配給整數? 謝謝! – harpalss 2009-12-14 22:44:41

+0

對不起,我認爲編碼將打印出來的格式與我輸入的格式相同。 – harpalss 2009-12-14 22:46:34

+0

使用此代碼,您只將行的第一個字符傳遞給正則表達式匹配器,這顯然總是失敗。更改'如果p.match(line [0])== None:'to'如果p.match(line)== None:' – 2009-12-15 01:25:06

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

+0

嘿感謝您的幫助,我完全按照您的方式輸入了代碼,並進行了您推薦的更改,但我仍然收到'無匹配'打印? – harpalss 2009-12-14 23:33:56

+0

這很奇怪。這個對我有用。你可以發佈你正在閱讀的文件的前幾行嗎? – 2009-12-14 23:54:38

+0

'p wncf 1569 817439 186191' 多數民衆贊成在目前的文件中的所有。 – harpalss 2009-12-15 00:17:43

2

您可能想改爲使用p.match(line)。您將該行的第一個字符傳遞給正則表達式,而不是整行。

1

你不需要一個正則表達式來做到這一點。這裏有一種方法可以檢查標題。

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()