捕获字符串中的整数并将其用作正则表达式的一部分

问题描述 投票:0回答:1

我有一根绳子:

s = ".,-2gg,,,-2gg,-2gg,,,-2gg,,,,,,,,t,-2gg,,,,,,-2gg,t,,-1gtt,,,,,,,,,-1gt,-3ggg"

以及我正在使用的正则表达式

import re
delre = re.compile('-[0-9]+[ACGTNacgtn]+') #this is almost correct
print (delre.findall(s))

返回:

['-2gg', '-2gg', '-2gg', '-2gg', '-2gg', '-2gg', '-1gtt', '-1gt', '-3ggg']

但是

-1gtt
-1gt
不是所需的匹配。本例中的整数定义了要匹配的后续字符数,因此这两个匹配的所需输出将分别是
-1g
-1g

有没有办法获取破折号后的整数并动态定义正则表达式,以便它匹配那么多且仅那么多后续字符?

python regex dna-sequence
1个回答
0
投票

您无法直接使用正则表达式模式执行此操作,但可以使用捕获组来分隔匹配的整数和字符部分,然后将字符部分修剪到适当的长度。

import re

# surround [0-9]+ and [ACGTNacgtn]+ in parentheses to create two capture groups
delre = re.compile('-([0-9]+)([ACGTNacgtn]+)')  

s = ".,-2gg,,,-2gg,-2gg,,,-2gg,,,,,,,,t,-2gg,,,,,,-2gg,t,,-1gtt,,,,,,,,,-1gt,-3ggg"

# each match should be a tuple of (number, letter(s)), e.g. ('1', 'gtt') or ('2', 'gg')
for match in delre.findall(s):  
    print(match[0], match[1][-int(match[0]):])

此打印

2 gg
2 gg
2 gg
2 gg
2 gg
2 gg
1 t
1 t
3 ggg

您很可能想做

print
以外的事情,但您可以根据需要格式化匹配的字符串!

© www.soinside.com 2019 - 2024. All rights reserved.