在字符串列表中查找模式

时间:2014-09-23 21:53:47

标签: python regex list

我有一个带标题的数组,我使用以下命令获取标题:

>>> 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 个答案:

答案 0 :(得分: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匹配($表示的意思)和.*匹配MAG之前的任何内容1}}或MAG_ERR

您的解决方案无效,因为您将所有标头合并为一个字符串,因此以后很难将它们分开。使用filter或列表推导允许您隐式循环遍历数组,提取您感兴趣的项目。

答案 1 :(得分:1)

您可以使用str.endswith()来获取以所需字符串结尾的标题:

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

答案 2 :(得分: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')]

答案 3 :(得分: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。正则表达式的其余部分保持不变。