разделить командный вопрос - PullRequest
1 голос
/ 10 августа 2011

У меня проблема с использованием команды 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

Я запутался в этой команде split!(Я задавал подобный вопрос раньше, и в то время работала команда split) спасибо

Ответы [ 7 ]

6 голосов
/ 10 августа 2011

Похоже, что вам нужно:

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'
2 голосов
/ 10 августа 2011

Попробуйте это:

#!/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 - это максимальное количество операций разделения.

1 голос
/ 10 августа 2011

Второй аргумент split - это максимальное количество упражнений на разделение, поэтому вы, вероятно, не хотите использовать его в этом случае. Чтобы получить доступ к 5-му элементу после выполнения разделения, сделайте следующее:

line.split(":")[4]

В любом случае, вам, вероятно, нужно сначала разделить пробелами (вы можете сделать это без аргументов), а затем разделить двоеточиями. Это можно сделать в одну строку следующим образом:

line.split()[0].split(":")[4]
0 голосов
/ 11 августа 2011

Я предполагаю, что вы будете делать многочисленные извлечения информации из строк в будущем. Тогда я советую научиться использовать инструмент регулярных выражений, это будет неизбежно.

Или вам придется изучать и использовать специализированную библиотеку для обработки строк в области геномики.

Простое решение вашей нынешней проблемы с модулем 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+ перестанет совпадать в строке, как только встретится нецифровый символ

Круглые скобки определяют группы. Здесь нужный номер ловится второй группой

0 голосов
/ 10 августа 2011

Вы должны использовать split?

Я спрашиваю об этом, потому что я нашел, что регулярное выражение - гораздо лучший инструмент, когда мне нужно просто захватить определенную подстроку.Это не самая простая вещь для изучения, и поначалу она кажется очень недоступной, но вы должны заплатить цену за ее изучение только один раз, и это стоит вложений.:)

Домашняя страница Python содержит хорошее представление.

PS 2027 будет соответствовать следующему регулярному выражению .*?:([0-9]+)\s+

0 голосов
/ 10 августа 2011

Сплит на пустое пространство первым. Затем разделите первый элемент в результирующем списке на основе разделителя (здесь: ':').

line.split()[0].split(':')[4]
0 голосов
/ 10 августа 2011

Вы можете использовать вместо:

s.split()[0].split(':')[4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...