我正在处理过滤大量遗传数据。为了易于参考,我们将使用一串较短的元素:
geneData = 'gggtacaccaaGGCCTATAACAttacatCTACATTGGAtcaggatccaaaATTAAGGAA'
我想将此字符串分为单词的所有大写部分的列表(最终使用小写部分),所以这是我所需的输出:
cleanedExons = ['GGCCTATAACA', 'CTACATTGGA', 'ATTAAGGAA']
这类似于我过去如何将单词与句子分开,我一直在尝试调整代码以将字符串分为列表,但很少成功。这是我当前的代码:
def Exon_Split(string):
IntronLetters = 'gcat'
L=string.split(IntronLetters)
cleanedExons=[]
ExonLetters = 'GCAT'
for e in L:
word = ''
for c in e:
if c in ExonLetters:
word += c
if word!=ExonLetters:
cleanedExons.append(word)
print(cleanedExons)
Exon_Split(geneData)
这是我获得的输出。如您所见,它不会被分为所需的元素:
['GGCCTATAACACTACATTGGAATTAAGGAA']
有没有办法使python将这些大写的这些块视为"单词"?
有问题吗?使用Regex:
import re
geneData = 'gggtacaccaaGGCCTATAACAttacatCTACATTGGAtcaggatccaaaATTAAGGAA'
pU = re.compile('[A-Z]+')
pL = re.compile('[a-z]+')
cleanedExons = pU.findall(geneData)
# repeat with PL
我做了一些性能测试,出于无聊:
# 10000000 iterations
# regex split: 40.23s
# regex findall: 26.53s
# the itertool version posted in another answer: 163.82s
所以re.findall
是赢家。findall
的学分转到 @tomothy32,我发布的初始版本使用了split
。
使用itertools.groupby
是一种方法:
import itertools
geneData = 'gggtacaccaaGGCCTATAACAttacatCTACATTGGAtcaggatccaaaATTAAGGAA'
cleanedExons = [''.join(g) for k, g in itertools.groupby(geneData, key=str.isupper) if k]
print(cleanedExons)
# ['GGCCTATAACA', 'CTACATTGGA', 'ATTAAGGAA']
对于小写,只需将str.isupper
更改为str.islower
。