Сопоставление геномной позиции с помощью регулярного выражения

#python #regex #bioinformatics

#python #регулярное выражение #биоинформатика

Вопрос:

Мне нужна помощь в создании регулярного выражения для следующих типов строк, я использую Python, но подойдет общее регулярное выражение…

 chr1:82137-81236
X  2Mb  6Mb
chr4:87K 1000K
  

Я запустил его, но не могу заставить его работать для всего, что мне нужно:

 (CHR)*s*([0-9]{1,2}|X|Y|MT)s*(-|:)?s*(d )s*(MB|M|K)?s*(-|:)?s*(d )s*(MB|M|K)?
  

Это будет соответствовать ситуациям, когда я этого не хочу, например:

 CHR33   -     12   3
  

сопоставляется, но не так, как я хочу:

 Group 1.    CHR
Group 2.    33
Group 3.    -
Group 4.    12
Group 5.     
Group 6.     
Group 7.    3
Group 8.
  

Я бы хотел, чтобы были возвращены следующие группы:

 Group 1: CHR or nothing

Group 2: The chromosome value (1-20,X,Y,MT)

Group 3: The separator between chromosome and first position

Group 4: The numeric portion of the first position

Group 5: The numeric quantifier (M,Mb,K) or nothing if none

Group 6: The separator between position1 and position2

Group 7: The numeric portion of the second position

Group 8: The numeric quantifier (M,Mb,K) or nothing if none
  

Псевдо-регулярное выражение должно выглядеть следующим образом:

 (CHR)(1-20|MT|X|Y)(delimiter s*|-|:)(pos1 numeric)(pos1 quantifier)(delimiter s*|-|:)(pos2 numeric)(pos2 quantifier)
  

Ответ №1:

Измените регулярное выражение, чтобы также разрешить пустое совпадение (пробелы добавлены для удобства чтения):

 (CHR|)*s*              # CHR or nothing
([0-9]{1,2}|X|Y|MT)s*  # Chromesome value
(-|:)?s*               # Separator
(d )s*                # Numeric portion of 1st position
(MB|M|K|)?s*           # Numeric quantifier or nothing
(-|:|)?s*              # Separator b/w position 1 and position 2 or nothing
(d |)s*               # Numeric portio of the 2nd position or nothing
(MB|M|K|)?              # Numeric quantifier or nothing
  

Демонстрация Regex101

Комментарии:

1. Очень аккуратное исправление, 1 🙂 @mattjvincent вы можете использовать этот аккуратный формат в Python, добавив (?x) флаг вверху или re.VERBOSE в настройках.