子列表每个位置的正则表达式模式的频率

时间:2019-05-10 08:50:52

标签: python regex list dictionary

我有一个列表列表:

x = [[AATG, ATAT, GGCC],
     [CCTA, TCGT, AAAA],
     [TTAA, GGAT, TACA]]

列表中的字符仅是ATCG的组合,列表中的每个元素的长度均为四个字符。内部列表的长度相等。

我想估计仅具有A和T所有组合的元素的频率;例如每列中的ATAT(第一行第二列),AAAA(第二行第三列)和TTAA(第三行第一列)。

为了调用A和T的所有组合,我使用了正则表达式:

 pattern = re.findall('[AT]{4}', key)

用于阅读列表

y = []
for i in range(len(x[0])):
    per.append(len([j[i] for j in x if j[i]==pattern])/len(x))
print(y)

如果我使用诸如“ ATAT”之类的特定字符串,则此代码有效:

y = []
for i in range(len(x[0])):
    per.append(len([j[i] for j in x if j[i]=='ATAT'])/len(x))
print(y)

,但不适用于带有regrex的模式。可以是re.findall可以调用的任何东西,例如:

'[CG]{4}' for all element has C or G
'^(?=[GC]*[AT][GC]*$).{4}$' for 75% of element has G or C

预期输出:

[0.34, 0.34, 0.34]

2 个答案:

答案 0 :(得分:1)

您可以使用不带正则表达式的成员资格检查来简化检查:只需检查元素是否完全由“ A”和“ T”组成。

x = [['AATG', 'ATAT', 'GGCC'],
     ['CCTA', 'TCGT', 'AAAA'],
     ['TTAA', 'GGAT', 'TACA']]

members = {'A', 'T'}
result = []
for row in x:
    #creates a list of bools, True only if an element contains just items from members set
    element_status = [all(char in members for char in element) for element in row]
    result.append(sum(element_status)/len(element_status))

print(result)
[0.3333333333333333, 0.3333333333333333, 0.3333333333333333]

要对正则表达式执行相同操作,您的模式确实可以工作。如果使用findall,则只需使用返回元素的长度即可。

import re
x = [['AATG', 'ATAT', 'GGCC'],
     ['CCTA', 'TCGT', 'AAAA'],
     ['TTAA', 'GGAT', 'TACA']]

members = {'A', 'T'}
pattern = '[AT]{4}'
result = []
for row in x:
    element_status = [len(re.findall(pattern, element)) for element in row]
    result.append(sum(element_status)/len(element_status))

print(result)

答案 1 :(得分:1)

在您的if语句if j[i]==pattern中,检查j[i]是否等于findall的结果,该结果返回所有非重叠的匹配项。

您可以改用if pattern.match(j[i]) re.match来检查匹配是否是字符类中匹配的4倍。

x = [['AATG', 'ATAT', 'GGCC'],
     ['CCTA', 'TCGT', 'AAAA'],
     ['TTAA', 'GGAT', 'TACA']]

pattern = re.compile('[AT]{4}')

y = []
for i in range(len(x[0])):
    y.append(len([j[i] for j in x if pattern.match(j[i])])/len(x))
print(y)

结果:

[0.3333333333333333, 0.3333333333333333, 0.3333333333333333]

Python demo