【问题标题】:Python regex function to count repetitions of substring or divide a substring?Python正则表达式函数来计算子字符串的重复或划分子字符串?
【发布时间】:2026-01-16 04:50:01
【问题描述】:

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

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

['AGATCAGATCAGATCAGATC', 'TATCTATCTATCTATCTATC', 'GAAA', 'GATA', 'AATG', 'GAAA', 'GAAA', '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)

【问题讨论】:

  • 如果我对您的理解正确,您不想要重复的字符串(例如 'AGATCAGATCAGATCAGATC',而是 4 个单匹配项),然后您可以对其进行计数。如果是这样,您只需从搜索模式中删除“+”并检查结果列表的长度。
  • 有点,我需要的是计算重复次数在“AGATCAGATCAGATCAGATC”的情况下,它对应于 4,但如果 AGATC 出现在字符串中的另一个位置,我会得到 5 并且将是不正确的,因为我需要计算字符串中任何位置的最大重复次数。不幸的是,我认为删除 + then 会产生不正确的结果?
  • 啊,所以你想要任何模式的最大连续重复次数?例如。在您的示例 5 中为 TATC... 部分?
  • 没错,这就是我想要弄清楚的。

标签: python regex string dictionary substring


【解决方案1】:

如果我正确理解您的问题,您可以为每种模式分别执行此操作,例如类似:

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}")

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

【讨论】:

  • 谢谢,这似乎返回了一个正确的数字(我认为我确实理解它背后的逻辑)。我现在正在尝试修改代码以打印多次发现的模式,例如,“AGATC”是发现 4 次的模式。
  • 我修改了代码。如果您需要具有最大长度的所有模式,则必须对其进行一些修改,但您可能会自己弄清楚。
  • 非常感谢!我想出了这个版本(我更改了一些变量的名称): STR_name = long[:int(len(longest)/STR_max)] 你真的帮助了我,我真的很感激。
最近更新 更多