2014-12-02 49 views
-2

後,我已經得到了多個文件是這樣的:正則表達式找到值從年初開始,回報

11111111111111 
11010111101101 
11110011110101 
10014000010001 
13500000101111 
11108000010161 
10100101111501 
10000600116051 
11011001000101 
110080101158001 
10012001010001 
11111111111111 

我計算了所有這些文件中的行數和列數。 現在我正在嘗試寫一些以確保所有這些文件都以滿足1的行開頭。

我遇到的第二個問題是找到所有行長度都是列數的所有文件。在這裏,我們不應該能夠用我們的正則表達式來選擇第10行。

+3

爲什麼你首先使用'%g'或'%f'? '{10.000000}'不是有效的重複計數。那實際上是你想要創造的模式嗎? – abarnert 2014-12-02 21:20:00

+0

爲什麼最後的'\ s'?這些線是否在一個空間中結束? – Bakuriu 2014-12-02 21:20:38

+1

另外,你爲什麼要找10個1或10個以上的副本,然後是另外的10個1呢?這是什麼模式_supposed_是什麼意思? – abarnert 2014-12-02 21:20:55

回答

1

如果你只是想知道第一行是否包含全1,就看第一行。閱讀整個文件只是過分複雜的東西。試圖找出多少個1來尋找,而不是僅僅「全部」而過分複雜。只是保持簡單。

with open(filename) as f: 
    line = next(f, 'X').strip() 
    if all(c == '1' for c in line): 
     # yes 

或者,如果你想成爲一個有點聰明:

with open(filename) as f: 
    line = next(f, 'X').strip() 
    if not line.replace('1', ''): 
     # yes 

或者,如果你真的想用一個正則表達式:

with open(filename) as f: 
    line = next(f, 'X').strip() 
    if re.match(r'^1+$', line): 
     # yes 

next(f, 'X')可以確保一個空文件不會引發異常,並且也無法通過測試(因爲'X'.strip()不是全1的),Jon Clements建議。

+1

好的,我要去'如果不是下一步(f,'Z')。strip()。translate(None,'1')'但是...這看起來像是最全面的答案:) – 2014-12-02 21:40:27

+1

@JonClements:是的,但是試圖編寫可在2.x和3.x下運行的「str.translate」代碼是非常特別的樂趣。 :) – abarnert 2014-12-02 21:41:32

+0

雖然,現在我在審美思考'line = next(f,'').strip()'然後'如果行和不是......'但無論如何 - 我現在閉嘴:) – 2014-12-02 21:51:19

0

我想這將是回答你的第一個問題:

^1+\s*\n 
  • ^開始字符串
  • 1+字符1的,至少重複一次
  • \s*的不確定數量空格(零個,一個或多個)
  • \n行尾
+0

根據OP的註釋,您可能希望在\ r之前添加一個空格(也許是可選的或重複的)。 – abarnert 2014-12-02 21:28:07

+0

謝謝,沒有看到這個新奇:) – 2014-12-02 21:30:10

0

我們如何避免正則表達式,並一次只讀取一行文件?

def fileFormatIsCorrect(filename): 
    lines = open(filename).readlines() 

    for i in range(0, len(lines)): 
     line = lines[i] 

     # check for the initial row of ones 
     if i == 0 and not (line.strip().replace("1","") == ""): 
      return False 
     if len(line) != len(lines): 
      return False 
    return True 
+0

第一行只包含'1'的情況如何? – 2014-12-02 21:32:12