Извлечь число переменной длины, используя регулярное выражение в Python - PullRequest
1 голос
/ 29 февраля 2012

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

Для разбора и извлечения других функций я использовал индексы List вместе с различными разделителями '|', '' и ':'. Но в этом случае я могу добраться до блока (ниже) и должен извлечь для каждой строки цифры вокруг '_' отдельно как x и y.

Одним из способов может быть сначала разделить на ':' и затем на '' и, наконец, на '-', но и извлечь позиции индекса [0] и [1], но это будет самый неэффективный способ сделать это .

chr5: 17399789-17401949 ОБРАТНЫЙ

chr5: 6414488-6415907 FORWARD

chr5: 2981156-2982709 ВПЕРЕД

chr5: 6311725-6313323 ОБРАТНЫЙ

chr5: 12791432-12794551 ОБРАТНЫЙ

chr5: 927915-930781 ВПЕРЕД

chr5: 19585936-19587841 ВПЕРЕД

chr5: 26894856-26896488 FORWARD

chr5: 18138775-18142147 ОБРАТНЫЙ

chr5: 20537525-20538943 ОБРАТНЫЙ

chr5: 22496196-22500543 ОБРАТНЫЙ

chr5: 4747860-4753592 ОБРАТНЫЙ

Приведенный выше блок взят из «большего блока», например:

AT1G09410.1 | Символы: | белок, содержащий повтор пентатрикопептида (PPR) | chr1: 3035443-3037560 ВПЕРЕД

Могу ли я извлечь в 'больший блок' также?

Мой уровень программирования лучше всего описывает начинающего и нуждается в вашей помощи.

Спасибо

AK

1 Ответ

3 голосов
/ 29 февраля 2012

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

    numericalBlockRegEx = r'chr\d+:(?P<firstNumBlock>\d+)-(?P<secondNumBlock>\d+)'

Наконец, как только вы на самом деле запустите свое регулярное выражение для каждой строки файла (вам, скорее всего, придется использовать поиск вместо сопоставления), вы можете извлечь интересующий вас числовой блок с помощью простого вызова:

    x = match.group('firstNumBlock') #Gets first number block matched
    y = match.group('secondNumBlock') #Gets second number block matched

ура!

...