Python 2.7 Regex; Нахождение разного количества выражений

Я работаю над биоинформатическим проектом и в настоящее время пытаюсь разбить определенную строку, содержащую местоположения на хромосоме. Пример нескольких строк, которые называются «местоположение»:

 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), ()]

Есть ли какое-нибудь выражение, которое могло бы решить эту проблему? Или мне следует посмотреть и попытаться удалить пустые списки после того, как найду их так, как я это делаю?

Именно так работает регулярное выражение с re.findall, элемент будет добавлен для каждой группы захвата в шаблоне. Однако вы всегда можете отфильтровать ненужные пустые элементы.

Wiktor Stribiżew 05.04.2018 15:12

Да, это невозможно. Вам придется отфильтровать пустые кортежи. Но прежде, чем вы это сделаете, у этого формата есть название? Вероятно, есть пакет, чтобы прочитать это.

Azsgy 05.04.2018 15:12

Поскольку @ WiktorStribiżew сказал, что re.findall работает, вам сначала нужно разделить строку местоположения и использовать ее в правой части, например: re.findall("\d+", location.split(":g.")[1])

mck89 05.04.2018 15:22

разделите строку точкой ., затем возьмите последний кусок и разделите его с помощью _ - готово

Ankush Rathi 05.04.2018 15:23

Есть много рабочих мест. Выберите один, попробуйте и вернитесь, если у вас возникнут другие проблемы.

Wiktor Stribiżew 05.04.2018 15:27

У формата действительно нет названия. Это дамп данных, хранящийся в ужасном формате .xlsx. Использование re.findall ("\ d +", location.split (": g.") [1]) работает довольно неплохо. Единственная проблема в том, что в конце, кажется, есть неразрывный пробел, но я думаю, что проигнорирую его с помощью оператора try.

Nulnulzeven 05.04.2018 17:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
51
1

Ответы 1

Вот что можно было сделать:

[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

Другие вопросы по теме