2014-01-29 78 views
2

我正在嘗試原始正則表達式以幫助我查找和下載文件。因此,我想知道爲什麼下面的代碼不起作用?我明白,re.findall會創建一個對象,我會想象這是我誤入歧途的地方。一如既往地感謝。python正則表達式基礎知識

server_list1=('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25') 

x=[] 

for item in server_list1: 

    if re.findall(r'gz', item) == 1 : 

     x.append(item) 
+0

findall返回匹配字符串列表。請參閱文檔。 – krait

回答

3

嘗試丟棄== 1,就像這樣:

for item in server_list1: 
    if re.findall(r'gz', item) : 
     x.append(item) 

# x => ['part002.csv.gz', 'part001.csv.gz', 'part002.csv.gz'] 

在一個側面說明,你的正則表達式將在輸入字符串匹配gz隨時隨地。要確保字符串以gz結尾,請使用末尾錨點($),如gz$\.gz$,如果要確保它以.gz結尾。

+0

真誠的感謝。 –

4

是的,re.findall返回一個對象(就像Python中的所有東西一樣)。但是,該對象是一個匹配列表,它永遠不會等於整數1


由於空列表在Python評估爲False,您可以修復只需做題:

if re.findall(r'\.gz$', item): 

下面是一個演示:

>>> import re 
>>> server_list1=('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25') 
>>> x=[] 
>>> for item in server_list1: 
...  if re.findall(r'\.gz$', item): 
...   x.append(item) 
... 
>>> x 
['part002.csv.gz', 'part001.csv.gz', 'part002.csv.gz'] 
>>> 

而且,你會發現,我將您的Regex模式更改爲\.gz$,而不僅僅是gz。新字符串將匹配字符串末尾的.gz,而不是字符串中任何位置的gz


然而,正如@krait下文提到的,你不應該使用re.findall測試如果一個字符串包含一個模式。相反,你應該使用re.search

>>> import re 
>>> server_list1=('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25') 
>>> x=[] 
>>> for item in server_list1: 
...  if re.search(r'\.gz$', item): 
...   x.append(item) 
... 
>>> x 
['part002.csv.gz', 'part001.csv.gz', 'part002.csv.gz'] 
>>> 

或者說,在這種情況下甚至更好,擺脫正則表達式的完全和使用str.endswith

>>> server_list1=('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25') 
>>> x=[] 
>>> for item in server_list1: 
...  if item.endswith('.gz'): 
...   x.append(item) 
... 
>>> x 
['part002.csv.gz', 'part001.csv.gz', 'part002.csv.gz'] 
>>> 
+0

Findall在這種情況下是浪費的,因爲它必須構造一個從不使用的字符串列表。 – krait

+0

如果re.search(r'\ .gz $',item):根據什麼返回true或false? –

+1

@ChaseCB - 實際上,如果它找到了模式或者是'None',它會返回一個['re.MatchObject'](http://docs.python.org/2/library/re.html#re.MatchObject)不能。前者將評估爲「真」,但後者將評估爲「False」 – iCodez

1

用最務實的做法對於一個給定的問題。這根本不需要正則表達式匹配。

server_list1 = ('part002.csv.gz' , '2014-01-28', 'part001.csv.gz', '2014-01-28', 'part002.csv.gz', '2014-01-25') 

x = [] 

for item in server_list1: 
    if item.endswith('.gz'): 
     x.append(item) 

或者更簡潔地說:

x = filter((lambda item: item.endswith('.gz')), server_list1) 

只是用in運營商,或您指定(而不是r'\.gz$')正則表達式會錯誤地匹配figz.png,例如。

它也似乎是你在一個元組中存儲異構數據。首先,我建議您使用一個列表,因爲這對於處理可變數量的記錄更合適。其次,讓您的數據一致:使用元組的列表,如:

[('part002.csv.gz', '2014-01-28'), ('part001.csv.gz', '2014-01-28'), ('part002.csv.gz', '2014-01-25')] 

這樣一來,就可以確保所有文件名所屬存儲在第一元組索引和所有日期都存儲在第二元組指數。鑑於server_list1,上述結構可用以下方式生成:

data = zip(server_list1[::2], server_list1[1::2]) 
+0

謝謝....從未見過()函數的結尾。知識就是力量。 –