在Python中使用findall功能查找多个模式

时间:2016-01-08 01:34:18

标签: python string findall

有没有其他方法可以使用findall查找多个模式而不是仅仅添加函数?我刚刚开始使用python ...

txt = "UUUUUUUUUUUUUUCUUCUUCUUCUUCUUC"

print ("Phenylalanine " ) + str(len(re.findall(r'UUC',txt)) + len(re.findall(r'UUU',txt)))

这给出了10个匹配的正确答案,但这很难,当有更多模式时会发生什么:

print ("Leucine " ) + str(len(re.findall(r'UUA',txt)) + len(re.findall(r'UUG',txt)) + len(re.findall(r'CUU',txt)) + len(re.findall(r'CUC',txt)) + len(re.findall(r'CUA',txt)) + len(re.findall(r'CUG',txt)))

想到:

list1 = ['UUU', 'UUC', 'UUA', 'UUG', 'CUU', 'CUC', 'CUA', 'CUG' ];
list2 = ['Phenylalanine', 'Leucine'];

但是如何将它们匹配在一起?

或类似的东西:

print ("Phenylalanine " ) + str(len(re.findall(r'UUC' **and** 'UUU',txt)))

但/和/和/或/没有给我正确答案

我有64种模式可以匹配23个名字,如何更容易地做到这一点?怎么用桌子? 谢谢

1 个答案:

答案 0 :(得分:-1)

因此,一种方法是迭代list1中的所有项目:

sequences = {
    'Phenylalanine' : [r'UUU', r'UUC'],
    'Leucine' : [r'UUA', r'UUG', r'CUU', r'CUC', r'CUA', r'CUG' ]
}    
for name, sequence_list in sequences.items():
    print (name, str(sum(len(re.findall(i, txt)) for i in sequence_list)))

上述方法并不好,因为它多次调用findall

另一种方法,如果你只想解析字符串一次将使用正则表达式的OR。 (abc|cde)将匹配abc或cde。但正则表达式更复杂,我不确定它是否会给你相同的结果。

通过正则表达式的简单方法是:len(re.findall(r"(UUC|UUU)", txt))

如果你有一个类似上面sequences的列表,那就像是:

sequences = {
    'Phenylalanine' : [r'UUU', r'UUC'],
    'Leucine' : [r'UUA', r'UUG', r'CUU', r'CUC', r'CUA', r'CUG' ]
}    
for name, sequence_list in sequences.items():
    print (name, str(len(re.findall("(" + "|".join(sequence_list) + ")", txt)))

以上两种方法都给了我:

Leucine 5
Phenylalanine 10

注意:您的整体问题似乎是DNA测序问题之一。我建议你使用一个预先存在的库来做这样的事情,因为如果你在这里深入工作会变得更加复杂。