我使用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
我对这个拆分命令感到困惑! (之前我问过类似的问题,当时拆分命令工作了) 感谢
答案 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定义组。这里所需的数字由第二组捕获