Я работаю над биоинформатическим проектом и в настоящее время пытаюсь разбить определенную строку, содержащую местоположения на хромосоме. Пример нескольких строк, которые называются «местоположение»:
NC_000023.11:g.154532082
NC_000023.11:g.154532058_154532060
NC_000023.11:g.154532046
То, что я хотел бы вернуть, выглядит так:
([154532082])
([154532058], [154532060])
([154532046])
Я не могу думать о регулярном выражении, которое обычно захватывает только первое число, а когда оно присутствует, отдельно захватывает второе число, не создавая вторую группу, как в случае:
re.findall(":g.(\d*)_?(\d*)", location)
which gives:
([154532082], [])
([154532058], [154532060])
([154532046], [])
или же
re.findall(":g.(\d*)", location), re.findall("\d_(\d*)", location)
which gives:
[(154532082), ()]
[(154532058), (154532060)]
[154532046), ()]
Есть ли какое-нибудь выражение, которое могло бы решить эту проблему? Или мне следует посмотреть и попытаться удалить пустые списки после того, как найду их так, как я это делаю?
Да, это невозможно. Вам придется отфильтровать пустые кортежи. Но прежде, чем вы это сделаете, у этого формата есть название? Вероятно, есть пакет, чтобы прочитать это.
Поскольку @ WiktorStribiżew сказал, что re.findall работает, вам сначала нужно разделить строку местоположения и использовать ее в правой части, например: re.findall("\d+", location.split(":g.")[1])
разделите строку точкой ., затем возьмите последний кусок и разделите его с помощью _ - готово
Есть много рабочих мест. Выберите один, попробуйте и вернитесь, если у вас возникнут другие проблемы.
У формата действительно нет названия. Это дамп данных, хранящийся в ужасном формате .xlsx. Использование re.findall ("\ d +", location.split (": g.") [1]) работает довольно неплохо. Единственная проблема в том, что в конце, кажется, есть неразрывный пробел, но я думаю, что проигнорирую его с помощью оператора try.






Вот что можно было сделать:
[re.search("(?<=:g.)(\d*)_?(\d*)", item).group() for item in location.split("\n")]
Что я здесь сделал, так это составить список, который должен делать все в одну строку. Идет по частям:
for item in location.split("\n")
Это выполняет итерацию по списку, составленному из строки местоположения, где я разделяю строку на все разрывы строк. Теперь цикл for будет перебирать каждую часть строки между разрывами строки. Каждая из этих частей теперь называется «предметом».
re.search("(?<=:g.)(\d*)_?(\d*)", item).group()
Здесь я выполняю утверждение положительного просмотра назад, что означает, что регулярное выражение будет искать ': g'. (часть? <=: g.), сопоставьте все после этого и удалите ': g.'. Что касается group (), это просто вывод совпадения из метода re.search ().
Прочтите документацию Python по регулярному выражению, это очень помогает: https://docs.python.org/2/library/re.html
Именно так работает регулярное выражение с
re.findall, элемент будет добавлен для каждой группы захвата в шаблоне. Однако вы всегда можете отфильтровать ненужные пустые элементы.