我有一根绳子:
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
。
有没有办法获取破折号后的整数并动态定义正则表达式,以便它匹配那么多且仅那么多后续字符?
您无法直接使用正则表达式模式执行此操作,但可以使用捕获组来分隔匹配的整数和字符部分,然后将字符部分修剪到适当的长度。
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
以外的事情,但您可以根据需要格式化匹配的字符串!