2013-02-07 99 views
2

所以我試圖在python中變得更好,但是我在正則表達式中使用re模塊時遇到了一些麻煩。Python正則表達式問題

我有我讀以逗號分隔的CSV文件,然後我想找到一個線中出現的所有逗號5.所以我用下面的代碼結尾:

five_rating = re.compile(r",5$", re.MULTILINE) 
    print five_rating.findall(file.read()) 

但我沒有得到任何輸出。肯定會出現與我正在使用的正則表達式匹配的事件,我已經在python正則表達式網站上測試了我的正則表達式,並且他們模擬了我想要的內容,但是在代碼中,它不起作用!

有什麼明顯的我在這裏做錯了嗎?

哦,我使用的是Ubuntu並且該文件應該有DOS風格的行結尾,但我試圖使用this post中的代碼轉換結束行字符,但它並沒有這樣做。

順便說一句,這裏的輸入樣本:

9605,Ace Ventura: Pet Detective,5 
9606,Ace Ventura: Pet Detective,1 
9607,Ace Ventura: Pet Detective,4 
9608,Ace Ventura: Pet Detective,3 
9609,Ace Ventura: Pet Detective,2 
9610,Ace Ventura: Pet Detective,4 
9611,Ace Ventura: Pet Detective,3 
9612,Ace Ventura: Pet Detective,4 
9613,Ace Ventura: Pet Detective,5 
9614,Ace Ventura: Pet Detective,5 
9615,Ace Ventura: Pet Detective,4 
9616,Ace Ventura: Pet Detective,1 
9617,Ace Ventura: Pet Detective,3 
9618,Ace Ventura: Pet Detective,4 
9619,Ace Ventura: Pet Detective,3 
9620,Ace Ventura: Pet Detective,1 
9621,Ace Ventura: Pet Detective,2 
9622,Ace Ventura: Pet Detective,3 
9623,Ace Ventura: Pet Detective,5 
9624,Ace Ventura: Pet Detective,2 
9625,Ace Ventura: Pet Detective,2 
9626,Ace Ventura: Pet Detective,4 
9627,Ace Ventura: Pet Detective,3 
9628,Ace Ventura: Pet Detective,1 
+0

對於這個特定的問題,正則表達式可能是矯枉過正的。 ['str.count'](http://docs.python.org/2/library/stdtypes.html#str.count)會很好地做到這一點。有關python正則表達式的更多信息,請參閱文檔中的howto(http://docs.python.org/2/howto/regex.html)。 –

+1

你是怎麼打開'file'的?另請注意,[**'file' **](http://docs.python.org/2/library/stdtypes.html#file-objects)是內置的Python,因此是標識符的不好選擇。我個人會使用[**'str.endswith()'**](http://docs.python。org/2/library/stdtypes.html#str.endswith)(除非你想從CSV中提取數據,在這種情況下,[** csv **](http://docs.python.org/) – Johnsyweb

+0

雖然正則表達式有其用途(特別是在文本編輯器本身中),但它們在代碼和腳本中經常被濫用,其中一個普通表達式更好,更易讀。 – kojiro

回答

1

給你輸入(可以是文件)作爲多行字符串,像這樣:

st='''9605,Ace Ventura: Pet Detective,5 
9606,Ace Ventura: Pet Detective,1 
9607,Ace Ventura: Pet Detective,4 
9608,Ace Ventura: Pet Detective,3 
9609,Ace Ventura: Pet Detective,2 
9610,Ace Ventura: Pet Detective,4 
9611,Ace Ventura: Pet Detective,3 
9612,Ace Ventura: Pet Detective,4 
9613,Ace Ventura: Pet Detective,5 
9614,Ace Ventura: Pet Detective,5 
9615,Ace Ventura: Pet Detective,4 
9616,Ace Ventura: Pet Detective,1 
9617,Ace Ventura: Pet Detective,3 
9618,Ace Ventura: Pet Detective,4 
9619,Ace Ventura: Pet Detective,3 
9620,Ace Ventura: Pet Detective,1 
9621,Ace Ventura: Pet Detective,2 
9622,Ace Ventura: Pet Detective,3 
9623,Ace Ventura: Pet Detective,5 
9624,Ace Ventura: Pet Detective,2 
9625,Ace Ventura: Pet Detective,2 
9626,Ace Ventura: Pet Detective,4 
9627,Ace Ventura: Pet Detective,3 
9628,Ace Ventura: Pet Detective,1''' 

這工作:

import re 

for line in st.splitlines(): 
    m=re.search(r'(^.*,5$)',line) 
    if m: print m.group(0) 

re.findall版本:

print re.findall(r'(^.*,5$)',st, re.MULTILINE) 

或(有點混亂恕我直言)re.findall將工作沒有括號:

print re.findall(r'^.*,5$',st, re.MULTILINE) 

你的是不工作,因爲沒有.*意思是 '匹配一切都交給了',5 $」

同樣如其中一條評論所述,使用file作爲標識符是一個壞主意。

您也可以使用Python的字符串處理要做到這一點:

for line in st.splitlines(): 
    if line.endswith(',5'): print line 

如果你真的有一個CSV文件來處理 - 使用內置的CSV模塊。


最後 - 如果你有在* nix DOS文件,只需使用Python的支持universal line通過它使用open with 'U'

with open(...,'rU') as infile: 
+0

所以它似乎我錯過了parens ...感謝 – Ethan

+1

@Ehan:那麼findall版本沒有parens工作 – dawg

+0

聖廢話...我忘了。* ....-_- – Ethan

1

注意,你並不真的需要這裏的正則表達式:

with open('file') as f: 
    lines = [l.strip() for l in f.readlines() if l.strip().endswith(',5')] 

print(list(lines)) 
>>> ['9605,Ace Ventura: Pet Detective,5', '9613,Ace Ventura: Pet Detective,5', '9614,Ace Ventura: Pet Detective,5', '9623,Ace Ventura: Pet Detective,5']