2014-09-23 37 views
2

我有頭的數組,我得到使用以下命令標題:在字符串列表找到一個模式

>>> headers=list(data.dtype.names) 
>>> headers 
['SqNr', 'Xpos', 'Ypos', 'ALPHA_J2000', 'DELTA_J2000', \ 
'UMAG', 'BMAG', 'VMAG', 'RMAG', 'IMAG', 'MB420MAG', \ 
'MB464MAG', 'MB485MAG', 'MB518MAG', 'MB571MAG', 'MB604MAG',\ 
'MB646MAG', 'MB696MAG', 'MB753MAG', 'MB815MAG', 'MB855MAG',\ 
'MB915MAG', 'UMAG_ERR', 'BMAG_ERR', 'VMAG_ERR', 'RMAG_ERR',\ 
'IMAG_ERR', 'MB420MAG_ERR', 'MB464MAG_ERR', 'MB485MAG_ERR',\ 
'MB518MAG_ERR', 'MB571MAG_ERR', 'MB604MAG_ERR', 'MB646MAG_ERR',\ 
'MB696MAG_ERR', 'MB753MAG_ERR', 'MB815MAG_ERR', 'MB855MAG_ERR',\ 
'MB915MAG_ERR', 'PHOTOZ', 'PHOTOZ_ERR', 'PHOTOZ2', 'PHOTOZ2_ERR',\ 
'Z_B', 'Z_B_MIN', 'Z_B_MAX', 'T_B', 'ODDS', 'CHISQUARED', 'Z_M',\ 
'Z_fp', 'Z_sp', 'Z_s'] 

我希望做一個列表包括與在MAG模式的所有字符串另一個包含MAG_ERR。我怎麼能這樣做? 我用的是下面幾行,以獲得正確的結果想:

import re 
pattern='MAG' 
re.match(r'(%s)+$' % pattern, "".join(headers)) 

但它不會返回任何東西。我怎麼能實現對正確答案分別是:

a=['UMAG', 'BMAG', 'VMAG', 'RMAG', 'IMAG', 'MB420MAG',\ 
    'MB464MAG', 'MB485MAG', 'MB518MAG', 'MB571MAG', 'MB604MAG',\ 
    'MB646MAG', 'MB696MAG', 'MB753MAG', 'MB815MAG', 'MB855MAG','MB915MAG'] 

回答

4

試試這個:

a=['SqNr', 'Xpos', 'Ypos', 'ALPHA_J2000', 'DELTA_J2000', \ 
'UMAG', 'BMAG', 'VMAG', 'RMAG', 'IMAG', 'MB420MAG', \ 
'MB464MAG', 'MB485MAG', 'MB518MAG', 'MB571MAG', 'MB604MAG',\ 
'MB646MAG', 'MB696MAG', 'MB753MAG', 'MB815MAG', 'MB855MAG',\ 
'MB915MAG', 'UMAG_ERR', 'BMAG_ERR', 'VMAG_ERR', 'RMAG_ERR',\ 
'IMAG_ERR', 'MB420MAG_ERR', 'MB464MAG_ERR', 'MB485MAG_ERR',\ 
'MB518MAG_ERR', 'MB571MAG_ERR', 'MB604MAG_ERR', 'MB646MAG_ERR',\ 
'MB696MAG_ERR', 'MB753MAG_ERR', 'MB815MAG_ERR', 'MB855MAG_ERR',\ 
'MB915MAG_ERR', 'PHOTOZ', 'PHOTOZ_ERR', 'PHOTOZ2', 'PHOTOZ2_ERR',\ 
'Z_B', 'Z_B_MIN', 'Z_B_MAX', 'T_B', 'ODDS', 'CHISQUARED', 'Z_M',\ 
'Z_fp', 'Z_sp', 'Z_s'] 

mags  = filter(lambda x: x[-3:]=='MAG', a) 
mag_errs = filter(lambda x: x[-7:]=='MAG_ERR', a) 

x[-3:]取出每個字符串的最後三個字符,並且x[-7:]取出最後七個字符。如果分別匹配MAGMAG_ERR,則lambda返回true,並且filter將相應的字符串放入輸出列表中。

您還可以使用:

mags  = filter(lambda x: x.endswith('MAG'), a) 
mag_errs = filter(lambda x: x.endswith('MAG_ERR'), a) 

如果你想使用正則表達式,你可以使用列表理解:

mags  = [x for x in a if re.match(r'.*MAG$', x)] 
mag_errs = [x for x in a if re.match(r'.*MAG_ERR$', x)] 

MAG$在該行的末尾匹配MAG(這就是$的含義)和.*匹配MAGMAG_ERR之前的任何內容。

您的解決方案將無法工作,因爲您將所有標題合併到一個字符串中,以後很難將它們分開。使用filter或列表理解允許您隱式地遍歷數組,從而抽出那些您感興趣的項目。

1

你可以使用字符串方法拔出與所需的字符串結束標題:

a = [x for x in headers if x.endswith("MAG") or x.endswith("MAG_ERROR")] 
1

正則表達式的解決方案:

import re 

# create list of matches for "MAG" 
MAG_matches = [line for line in headers if re.search(r'MAG(?!_ERR)\Z', line)] 

# create list of matches for "MAG_ERR'  
MAG_ERR_matches = [line for line in headers if re.search(r'MAG_ERR\Z', line)] 

簡單的解決方案與字符串方法:

# create list of matches for "MAG" 
MAG_matches = [line for line in headers if line.endswith('MAG')] 

# create list of matches for "MAG_ERR'  
MAG_ERR_matches = [line for line in headers if line.endswith('MAG_ERR')] 
+0

第二個不返回答案,但第一行工作! – Dalek 2014-09-23 22:04:17

+1

@Dalek請參閱編輯。我有一個錯誤的括號。他們現在應該很好。 – skrrgwasme 2014-09-23 22:12:59

0

如果我理解你,你想通過選擇MAG結束陣列項目,構建一種模式,則使將結果列表的字符串轉換爲單個模式,每個項目作爲備用。

mags = [ '.*%s$' % x for x in headers if x.endswith('MAG') ] 

是一個列表理解,建立每個項目的模式;那麼你需要交替他們並構建正則表達式:

mag_alternatives = re.compile('|'.join(mags)) 

現在,您可以使用它:

result = mag_alternatives.match(your_string) 
if result is not None: 
    # Do something with the match in result here 

我選擇了這種方法,因爲如果你想選擇一個不同的選擇。出了頭的,你只需要一個不同的函數調用,在理解中返回TRUE或FALSE。正則表達式的其餘部分保持不變。

相關問題