正则表达式匹配包含模式的单词,但也包含模式加上其他东西

时间:2015-05-08 22:34:01

标签: python regex

我有以下问题:

list1=['xyz','xyz2','other_randoms']
list2=['xyz']

我需要找到list2的哪些元素在list1中。实际上,list1的元素对应于我需要获得然后改变的数值。问题是'xyz2'包含'xyz',因此也与正则表达式匹配。

到目前为止我的代码(其中'data'是python字典,'specie_name_and_initial_values'是列表,其中每个子列表包含两个元素,第一个是specie名称,第二个是与它一起的数值):

    all_keys = list(data.keys())
    for i in range(len(all_keys)):
        if all_keys[i]!='Time':
            #print all_keys[i]
            pattern = re.compile(all_keys[i])
            for j in range(len(specie_name_and_initial_values)):
                print re.findall(pattern,specie_name_and_initial_values[j][0])

我尝试过的正则表达式的变体包括:

pattern = re.compile('^'+all_keys[i]+'$')
pattern = re.compile('^'+all_keys[i])
pattern = re.compile(all_keys[i]+'$')

我也尝试使用'in'作为限定符(即在for循环中)

非常感谢任何帮助。感谢

Ciaran

---------- ------------ EDIT

澄清。我目前的代码如下。它在类/方法之类的结构中使用。

def    calculate_relative_data_based_on_initial_values(self,copasi_file,xlsx_data_file,data_type='fold_change',time='seconds'):
    copasi_tool = MineParamEstTools() 
    data=pandas.io.excel.read_excel(xlsx_data_file,header=0) 
    #uses custom class and method to get the list of lists from a file
    specie_name_and_initial_values = copasi_tool.get_copasi_initial_values(copasi_file)
    if time=='minutes':
        data['Time']=data['Time']*60
    elif time=='hour':
        data['Time']=data['Time']*3600
    elif time=='seconds':
        print 'Time is already in seconds.'
    else:
        print 'Not a valid time unit'
    all_keys = list(data.keys())
    species=[]
    for i in range(len(specie_name_and_initial_values)):
        species.append(specie_name_and_initial_values[i][0])
    for i in range(len(all_keys)):
        for j in range(len(specie_name_and_initial_values)):
            if all_keys[i] in species[j]:
                print all_keys[i]

从pandas返回的表就像字典一样被访问。我需要转到我的数据表,提取标题(即all_keys位),然后在specie_name_and_initial_values变量中查找标题的名称并获取相应的值(specie_name_and_initial_value变量中的第二个元素)。在此之后,我将我的数据表的所有值乘以为每个匹配元素获得的值。

我最有可能过于复杂化。你有更好的解决方案吗?

感谢

----------编辑2 ---------------

好的,下面是我的变量

all_keys = set([u'Cyp26_G_R1',u'Cyp26_G_rep1',u'Time'])

species = set(['[Cyp26_R1R2_RARa]','[Cyp26_SRC3_1]','[18-OH-RA]','[p38_a]','[Cyp26_G_rep1]','[Cyp26]','[ Cyp26_G_a]','[SRC3_p]','[mRARa]','[np38_a]','[mRARa_a]','[RARa_pp_TFIIH]','[RARa]','[Cyp26_G_L2]','[atRA] ','[atRA_c]','[SRC3]','[RARa_Ser369p]','[p38]','[Cyp26_mRNA]','[Cyp26_G_L]','[TFIIH]','[Cyp26_SRC3_2]', '[Cyp26_G_R1R2]','[MSK1]','[MSK1_a]','[Cyp26_G]','[Basal_Kinases]','[Cyp26_R1_RARa]','[4-OH-RA]','[Cyp26_G_rep2] ','[Cyp26_Chromatin]','[Cyp26_G_R1]','[RXR]','[SMRT]'])

1 个答案:

答案 0 :(得分:2)

您不需要正则表达式来查找公共元素,set.intersection会在list2中找到同样位于list1中的所有元素:

list1=['xyz','xyz2','other_randoms']
list2=['xyz']

print(set(list2).intersection(list1))
set(['xyz'])

此外,如果您想将'xyz''xyz2'进行比较,则不会使用==,然后它会正确返回False。

您还可以更简洁地重写自己的代码:

for key in data:
    if key != 'Time':
        pattern = re.compile(val)
        for name, _ in specie_name_and_initial_values:
            print re.findall(pattern, name)

根据您的编辑,您以某种方式设法将列表转换为字符串,一个选项是剥离[]

all_keys = set([u'Cyp26_G_R1', u'Cyp26_G_rep1', u'Time'])

specie_name_and_initial_values = set(['[Cyp26_R1R2_RARa]', '[Cyp26_SRC3_1]', '[18-OH-RA]', '[p38_a]', '[Cyp26_G_rep1]', '[Cyp26]', '[Cyp26_G_a]', '[SRC3_p]', '[mRARa]', '[np38_a]', '[mRARa_a]', '[RARa_pp_TFIIH]', '[RARa]', '[Cyp26_G_L2]', '[atRA]', '[atRA_c]', '[SRC3]', '[RARa_Ser369p]', '[p38]', '[Cyp26_mRNA]', '[Cyp26_G_L]', '[TFIIH]', '[Cyp26_SRC3_2]', '[Cyp26_G_R1R2]', '[MSK1]', '[MSK1_a]', '[Cyp26_G]', '[Basal_Kinases]', '[Cyp26_R1_RARa]', '[4-OH-RA]', '[Cyp26_G_rep2]', '[Cyp26_Chromatin]', '[Cyp26_G_R1]', '[RXR]', '[SMRT]'])

specie_name_and_initial_values = set(s.strip("[]") for s in specie_name_and_initial_values)

print(all_keys.intersection(specie_name_and_initial_values))

哪个输出:

set([u'Cyp26_G_R1', u'Cyp26_G_rep1'])

仅供参考,如果您在集合中有列表,则会因为列表可变而导致错误,因此无法清除。