gpt4 book ai didi

python - 提取子字符串模式

转载 作者:太空宇宙 更新时间:2023-11-04 00:52:16 24 4
gpt4 key购买 nike

我有 1200 个序列的长文件

>3fm8|A|A0JLQ2
CFLVNLNADPALNELLVYYLKEHTLIGSANSQDIQLCGMGILPEHCIIDITSEGQVMLTP
QKNTRTFVNGSSVSSPIQLHHGDRILWGNNHFFRLNLP


>2ht9|A|A0JLT0
LATAPVNQIQETISDNCVVIFSKTSCSYCTMAKKLFHDMNVNYKVVELDLLEYGNQFQDA
LYKMTGERTVPRIFVNGTFIGGATDTHRLHKEGKLLPLVHQCYL

我想读取每个可能的模式,中间有半胱氨酸,开头有五个字符串,后面跟着其他五个字符串,例如 xxxxxCxxxxx

输出应该是这样的:

  • QDIQLCGMGIL
  • ILPEHCIIDIT
  • TISDNCVVIFS
  • FSKTSCSYCTM

这是只给出 C 位置的程序。它不像我想要的那样工作

pos=[]

def find(ch,string1):

for i in range(len(string1)):
if ch == string1[i]:
pos.append(i)
return pos



z=find('C','AWERQRTCWERTYCTAAAACTTCTTT')

print z

最佳答案

你需要在循环外返回,你在第一次匹配时返回,所以你只会在你的列表中得到一个字符:

def find(ch,string1):  
pos = []
for i in range(len(string1)):
if ch == string1[i]:
pos.append(i)
return pos # outside

您还可以使用 enumerate用列表组件代替范围逻辑:

def indexes(ch, s1):  
return [index for index, char in enumerate(s1)if char == ch and 5 >= index <= len(s1) - 6]

列表 comp 中的每个 index 都是字符索引,每个 char 都是实际字符,所以我们保留每个索引,其中 char 等于 ch。

如果你想要两边的五个字符:

In [24]: s="CFLVNLNADPALNELLVYYLKEHTLIGSANSQDIQLCGMGILPEHCIIDITSEGQVMLTP QKNTRTFVNGSSVSSPIQLHHGDRILWGNNHFFRLNLP"

In [25]: inds = indexes("C",s)

In [26]: [s[i-5:i+6] for i in inds]
Out[26]: ['QDIQLCGMGIL', 'ILPEHCIIDIT']

我添加了检查索引,因为如果索引 < 5 并且从末尾开始相同,我们显然无法在 C 之前获取五个字符。

您可以在一个函数中完成所有操作,在找到匹配项时生成一个切片:

def find(ch, s):
ln = len(s)
for i, char in enumerate(s):
if ch == char and 5 <= i <= ln - 6:
yield s[i- 5:i + 6]

假设您问题中的数据实际上是来自 yoru 文件的两行,例如:

s="""">3fm8|A|A0JLQ2CFLVNLNADPALNELLVYYLKEHTLIGSANSQDIQLCGMGILPEHCIIDITSEGQVMLTPQKNTRTFVNGSSVSSPIQLHHGDRILWGNNHFFRLNLP
>2ht9|A|A0JLT0LATAPVNQIQETISDNCVVIFSKTSCSYCTMAKKLFHDMNVNYKVVELDLLEYGNQFQDALYKMTGERTVPRIFVNGTFIGGATDTHRLHKEGKLLPLVHQCY"""

运行:

for line in s.splitlines():
print(list(find("C" ,line)))

会输出:

['0JLQ2CFLVNL', 'QDIQLCGMGIL', 'ILPEHCIIDIT']
['TISDNCVVIFS', 'FSKTSCSYCTM', 'TSCSYCTMAKK']

这给出了 6 个匹配项,而不是预期输出建议的 4 个匹配项,因此我认为您没有包括所有可能的匹配项。

您还可以使用 str.find 加速代码, 从最后一个匹配索引开始 + 1 为每个后续匹配

def find(ch, s):
ln, i = len(s) - 6, s.find(ch)
while 5 <= i <= ln:
yield s[i - 5:i + 6]
i = s.find(ch, i + 1)

这将给出相同的输出。当然,如果字符串不能重叠,您每次都可以开始在字符串中更远的地方寻找下一个匹配项。

关于python - 提取子字符串模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com