在字符串列表中查找模式

2024-09-28 21:50:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

>>> 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'] 

Tags: headerserrimagvmagumagrmagbmagmb485mag
3条回答

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

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

试试这个:

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并将相应的字符串放入输出列表。你知道吗

您还可以使用:

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或列表理解可以隐式地在数组中循环,拉出您感兴趣的项。你知道吗

正则表达式解决方案:

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')]

相关问题 更多 >