我有一个带标题的数组,我使用以下命令获取标题:
>>> 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']
答案 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:]
拉出最后七个字符。如果它们分别匹配MAG
或MAG_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。正则表达式的其余部分保持不变。