Python regex函数可计算子字符串的重复次数或划分子字符串?

问题描述

我希望您能为我指明正确的方向,因为我对编程(尤其是Python)非常陌生。我试图在较大的字符串中找到某些子字符串的最大重复计数。例如,'AGATC'在更长的字符串中重复了多少次(它可能只出现在一个地方,但是连续出现四次在另一个地方)。

我一直在阅读正则表达式,并编写了以下代码。它将成功分别打印出每个图案的重复次数,但是,我需要知道何时出现重复次数。我的代码的示例输出如下所示:

['AGATCAGATCAGATCAGATC','TATCTATCTATCTATCTATC','GAAA','GATA','AATG','GATA']

在这种情况下,'AGATC'出现四次,但是'TATC'重复五次,因此我需要将此作为整数。如果有人有什么想法让我前进,我将非常感激。

这是我的完整代码:

import re

# Opens the textfile and stores it as a string
with open('STR.txt') as strfile: 
    for row in strfile:
        STRs = row

# Defines patterns we are searching for in STR
pattern1 = (r'(?:AGATC)+')
pattern2 = (r'(?:TTTTTTCT)+')
pattern3 = (r'(?:AATG)+')
pattern4 = (r'(?:TCTAG)+')
pattern5 = (r'(?:GATA)+')
pattern6 = (r'(?:TATC)+')
pattern7 = (r'(?:GAAA)+')
pattern8 = (r'(?:TCTG)+')

# Recompiles all patterns into one single pattern
mainpattern = re.compile("(%s|%s|%s|%s|%s|%s|%s|%s)" % (pattern1,pattern2,pattern3,pattern4,pattern5,pattern6,pattern7,pattern8))

# Finds the pattern matches in STR
STR_match = re.findall(mainpattern,STRs)

print(STR_match)

解决方法

如果我正确理解了您的问题,则可以针对每种模式分别执行此操作,例如像这样:

patterns = ('AGATC','TTTTTTCT','AATG','TCTAG',...)
max_len = 0
max_pattern = None
for pattern in patterns:
    match = re.findall(f'(?:{pattern})+',STRs)
    if match:
        longest = sorted(match)[-1]  # last is the longest match
        l = len(longest)/len(pattern)
        if l > max_len:
            max_len = l
            max_pattern = pattern
print(f"{max_len} x {max_pattern}")

此匹配项将返回所有连续匹配字符串的列表,如果按字母顺序对它们进行排序,则最长的字符串将始终是最后一个字符串,因为它们会重复该模式。然后,您可以计算该字符串中模式重复的次数。
如果只需要最长的重复次数,则可以如图所示计算这些数字的最大值。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...