Можно ли использовать обратную ссылку, чтобы указать количество повторений в регулярном выражении? - PullRequest
0 голосов
/ 03 апреля 2010

Можно ли использовать обратную ссылку, чтобы указать количество повторений в регулярном выражении?

foo = 'ADCKAL + 2AG. + 2AG. + 2AG. + 2AGGG + .G + 3AGGa.'

Подстроки, начинающиеся с '+ [0-9]', за которыми следует '[A-z] { n }.' необходимо заменить просто на «+», где переменная n - это цифра из подстроки. Может ли это n быть возвращено? Например (не работает) '+ ([0-9]) [A-z] {/ 1}.' это шаблон, который я хочу заменить на «+» (последняя точка может быть любым символом и представляет показатель качества), так что foo должен появиться в ADCKAL +++ G.G +.

 import re
 foo = 'ADCKAL+2AG.+2AG.+2AG.+2AGGG+.+G+3AGGa.'
 indelpatt = re.compile('\+([0-9])')
 while indelpatt.search(foo):
     indelsize=int(indelpatt.search(foo).group(1))
     new_regex = '\+%s[ACGTNacgtn]{%s}.' % (indelsize,indelsize)
     newpatt=re.compile(new_regex)
     foo = newpatt.sub("+", foo)

Возможно, мне не хватает более простого способа разбора строки.

1 Ответ

1 голос
/ 03 апреля 2010

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

import re

foo = 'ADCKAL+2AG.+2AG.+2AG.+2AGGG^+.+G+3AGGa4.'
pattern = '|'.join('\+%s[ACGTNacgtn]{%s}.' % (i, i) for i in range(1, 10))
regex = re.compile(pattern)
foo = regex.sub("+", foo)
print foo

Результат:

ADCKAL++++G^+.+G+4.

Обратите внимание, что ваш код содержит ошибку, из-за которой он вводит бесконечный цикл на введенном вами входе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...