使用位置从字符串中提取字母
Extract letters from a string using the position
我是 Python 的初学者,我正在使用 Python 2.7.
我有一个 DNA 序列(字符串 dna
),我必须根据它们在 dna 字符串中的位置提取字母。位置由字符串sequence
定义,其中点号前的第一个数字表示从dna
字符串中提取的第一个字母,第二个数字到最后一个。
我必须用一个循环来做到这一点,使 python 程序尽可能简单。我花了几天时间尝试编写代码,但一直无法使它工作。这是我到目前为止所做的,但它不起作用。有什么帮助吗?
dna='abcde'
sequence=' 0..2, 4..5, 4..5'
import re
b=re.finditer('([0-9]{1}\.\.([0-9]{1}))', sequence)
for j in b:
print int(j.group(2))
a=re.finditer('(([0-9]{1})\.\.[0-9]{1})', sequence)
for f in a:
print int(f.group(2))
for element in sequence:
print dna[int(f.group(2)):int(j.group(2))]
你在你的模式前省略了 r
:
>>> b=re.finditer(r'([0-9]{1}\.\.([0-9]{1}))', sequence)
>>> for j in b:
... print int(j.group(2))
...
5
5
但是对于拆分序列,您不需要正则表达式,您可以使用列表理解和 str.split()
:
>>> l=[i.split('..') for i in sequence.split(',')]
>>> [(int(i),int(j)) for i,j in l]
[(0, 2), (4, 5), (4, 5)]
>>> for i,j in indices :
... print dna[i:j]
...
ab
e
e
那……呢:
dna='abcde'
sequence=' 0..2, 4..5, 4..5'
import re
b=re.finditer(r'([0-9]+)\.\.([0-9]+)', sequence)
for j in b:
print dna[int(j.group(1)) : int(j.group(2))]
这会打印
ab
e
e
因为切片在 Python 中排除了最后一个索引。如果您想要看到 abc
和 ef
,只需将 print
更改为
print dna[int(j.group(1)) : int(j.group(2)) + 1]
即,只需在切片语法的右侧部分加 1。
import re
dna='abcde'
sequence='0..2, 4..5, 4..5'
positionlist = sequence.split(", ") #splits string on, and puts parts in list
dnalist = list(dna) #splits to seperate letters
for i in xrange(len(positionlist)): #make an array of arrays (last array has 2 values, start and stop)
range1 = positionlist[i].split("..")
range1 = map(int,range1) #convert from string to integer
print dnalist[range1[0]:range1[1]]
这是一个没有正则表达式的实现。可能不是最简单的,但我和你一样也是初学者,所以我做了这个作为对自己的测试。
我是 Python 的初学者,我正在使用 Python 2.7.
我有一个 DNA 序列(字符串 dna
),我必须根据它们在 dna 字符串中的位置提取字母。位置由字符串sequence
定义,其中点号前的第一个数字表示从dna
字符串中提取的第一个字母,第二个数字到最后一个。
我必须用一个循环来做到这一点,使 python 程序尽可能简单。我花了几天时间尝试编写代码,但一直无法使它工作。这是我到目前为止所做的,但它不起作用。有什么帮助吗?
dna='abcde'
sequence=' 0..2, 4..5, 4..5'
import re
b=re.finditer('([0-9]{1}\.\.([0-9]{1}))', sequence)
for j in b:
print int(j.group(2))
a=re.finditer('(([0-9]{1})\.\.[0-9]{1})', sequence)
for f in a:
print int(f.group(2))
for element in sequence:
print dna[int(f.group(2)):int(j.group(2))]
你在你的模式前省略了 r
:
>>> b=re.finditer(r'([0-9]{1}\.\.([0-9]{1}))', sequence)
>>> for j in b:
... print int(j.group(2))
...
5
5
但是对于拆分序列,您不需要正则表达式,您可以使用列表理解和 str.split()
:
>>> l=[i.split('..') for i in sequence.split(',')]
>>> [(int(i),int(j)) for i,j in l]
[(0, 2), (4, 5), (4, 5)]
>>> for i,j in indices :
... print dna[i:j]
...
ab
e
e
那……呢:
dna='abcde'
sequence=' 0..2, 4..5, 4..5'
import re
b=re.finditer(r'([0-9]+)\.\.([0-9]+)', sequence)
for j in b:
print dna[int(j.group(1)) : int(j.group(2))]
这会打印
ab
e
e
因为切片在 Python 中排除了最后一个索引。如果您想要看到 abc
和 ef
,只需将 print
更改为
print dna[int(j.group(1)) : int(j.group(2)) + 1]
即,只需在切片语法的右侧部分加 1。
import re
dna='abcde'
sequence='0..2, 4..5, 4..5'
positionlist = sequence.split(", ") #splits string on, and puts parts in list
dnalist = list(dna) #splits to seperate letters
for i in xrange(len(positionlist)): #make an array of arrays (last array has 2 values, start and stop)
range1 = positionlist[i].split("..")
range1 = map(int,range1) #convert from string to integer
print dnalist[range1[0]:range1[1]]
这是一个没有正则表达式的实现。可能不是最简单的,但我和你一样也是初学者,所以我做了这个作为对自己的测试。