拆分命令问题

时间:2011-08-10 15:00:07

标签: python split

我使用split命令时遇到问题。 输入字符串如下:

080821_HWI-EAS301_0002_30ALBAAXX:1:8:1649:2027  83  chr10   42038185    255 36M =   42037995    -225    GCCAGGTTTAATAAATTATTTATAGAATACTGCATC    @?DDEAEFDAD@FBG@CDA?DBCDEECD@D?CBA>A    NM:i:0  MD:Z:36

我想从这个字符串中抓取'2027' 我的命令是:line.split(':',4)[1].split()[0] 但是,它不起作用。输出为'1'

然后我切换到line.split(':',4) 输出仍为“1”,我认为第一步拆分已经存在问题。

然而,当我尝试line.split(':',1)时,我得到了预期的结果:

1:8:1649:2027   83  chr10   42038185    255 36M =   42037995-225    GCCAGGTTTAATAAATTATTTATAGAATACTGCATC    @?DDEAEFDAD@FBG@CDA?DBCDEECD@D?CBA>A    NM:i:0  MD:Z:36

我对这个拆分命令感到困惑! (之前我问过类似的问题,当时拆分命令工作了) 感谢

7 个答案:

答案 0 :(得分:6)

看来你想要的是

line.split(':',4)[4].split()[0]

要拆分的数字参数表示将发生的最大拆分数。所以你有:

>>> line='080821_HWI-EAS301_0002_30ALBAAXX:1:8:1649:2027 ...'
>>> line.split(':',4)
['080821_HWI-EAS301_0002_30ALBAAXX', '1', '8', '1649', '2027 ...']

如果从这个返回值中拉出元素[1],则得到'1'。我不明白为什么你会对此感到惊讶。

由于您最多允许4个拆分,并且您想要的项目将是最后一个,所以您想要的下标是[4]:

>>> line.split(':',4)[4]
'2027 ...'

然后你可以在空格上分割它并从中获取元素[0]以产生你的结果。

如果您根本没有传递分割限制值,则会得到相同的结果:

>>> line.split(':')[4].split()[0]
'2027'

答案 1 :(得分:2)

试试这个:

#!/usr/bin/python

line = '080821_HWI-EAS301_0002_30ALBAAXX:1:8:1649:2027  83  chr10   42038185    255 36M =   42037995    -225    GCCAGGTTTAATAAATTATTTATAGAATACTGCATC    @?DDEAEFDAD@FBG@CDA?DBCDEECD@D?CBA>A    NM:i:0  MD:Z:36'

print line.split(':')[4].split()[0]

我不确定你为什么试图像这样访问包含2027的令牌:

line.split(':',4)

而不是:

line.split(':')[4]

我认为你可能会对分裂如何运作感到困惑。 Python split function的最后一个参数是要执行的最大拆分数。

答案 2 :(得分:1)

split的第二个参数是要运用的最大拆分数,因此在这种情况下您可能不希望使用它。要在执行拆分后访问第5个元素,请执行以下操作:

line.split(":")[4]

无论如何,你可能想要的是先用空格分割(你可以不用参数来做),然后用冒号分割。这可以在这样的一行上完成:

line.split()[0].split(":")[4]

答案 3 :(得分:0)

您可以改为使用:

s.split()[0].split(':')[4]

答案 4 :(得分:0)

首先拆分白色空间。然后根据分隔符(此处为:':')拆分结果列表中的第一个元素。

line.split()[0].split(':')[4]

答案 5 :(得分:0)

必须使用split吗?

我问这个是因为我发现正则表达式是一个更好的工具,当我只需要抓取一个特定的子字符串时。这不是最容易学习的东西,一开始看起来非常难以接近,但你必须付出一次学习它的代价,这是一项值得投资的投资。 :)

Python homepage对它有很好的介绍。

P.S。 2027将与以下正则表达式.*?:([0-9]+)\s+

匹配

答案 6 :(得分:0)

我认为您将来会从字符串中提取大量信息。然后,我的建议是学会使用正则表达式工具,这将是不可避免的。

或者您必须学习并使用专门的库来处理基因组学领域的字符串。

使用模块re解决当前问题的简单方法:

line = '''080821_HWI-EAS301_0002_30ALBAAXX:1:8:1649:2027  83  chr10
42038185    255 36M =   42037995    -225
GCCAGGTTTAATAAATTATTTATAGAATACTGCATC    @?DDEAEFDAD@FBG@CDA?
DBCDEECD@D?CBA>A    NM:i:0  MD:Z:36'''

import re

print re.search(':(\d+) ',line).group(1)

如果在第四个':'之前有空格,正则表达式的模式将是:

line = '''080821_HWI-EAS301_0002_30AL BAAXX:1:8     :1649:2027  83  chr10
42038185    255 36M =   42037995    -225
GCCAGGTTTAATAAATTATTTATAGAATACTGCATC    @?DDEAEFDAD@FBG@CDA?
DBCDEECD@D?CBA>A    NM:i:0  MD:Z:36'''

import re

print re.search('(:[^:]+){3}:(\d+)',line).group(2)

(:[^:]+)匹配“:”后跟可能跟随的“:”之间的多个字符

{3}表示此次匹配必须执行3次

然后必须遇到第四个':',然后是\d+匹配的搜索号码;不再需要指出数字后面必须有空格,因为只要遇到非数字字符,\d+将在字符串中停止匹配

Parentheseses定义组。这里所需的数字由第二组捕获