Eu tenho uma string:
s = ".,-2gg,,,-2gg,-2gg,,,-2gg,,,,,,,,t,-2gg,,,,,,-2gg,t,,-1gtt,,,,,,,,,-1gt,-3ggg"
e uma expressão regular que estou usando
import re
delre = re.compile('-[0-9]+[ACGTNacgtn]+') #this is almost correct
print (delre.findall(s))
Isso retorna:
['-2gg', '-2gg', '-2gg', '-2gg', '-2gg', '-2gg', '-1gtt', '-1gt', '-3ggg']
Mas -1gtt
e -1gt
não são correspondências desejadas. O número inteiro, neste caso, define quantos caracteres subsequentes corresponderão, portanto, a saída desejada para essas duas correspondências seria -1g
e -1g
, respectivamente.
Existe uma maneira de capturar o número inteiro após o traço e definir dinamicamente o regex para que ele corresponda a esse número e apenas a esse número de caracteres subsequentes?
Mais uma solução alternativa
re.sub
que faz isso sem loop:Saída:
ou então, se você quiser a saída em array, use:
Você não pode fazer isso diretamente com o padrão regex, mas pode usar grupos de captura para separar as partes inteiras e de caracteres da correspondência e, em seguida, cortar a parte dos caracteres para o comprimento apropriado.
Isso imprime
É mais do que provável que você queira fazer algo diferente de
print
, mas pode formatar as strings correspondentes da maneira que precisar!NOTA: isso falha nos casos em que o número inteiro é seguido por menos caracteres correspondentes do que o especificado, por exemplo,
-10agcta
ainda é uma correspondência mesmo que contenha apenas 5 caracteres.