繁体   English   中英

Python 3:如何确定字符串中重新出现的子字符串/模式?

[英]Python 3: How do I determine the re-occuring sub-string/pattern within a string?

我正在处理涉及解码消息的CheckIO编码问题。 我必须从已完成的给定加密和解密消息中找到密钥; pythonpythonpythonpythonp

但是,当我使用相同的密钥尝试解密比该字符串长的消息时,它将失败,因为我只能从p而不是y重新启动它。 因此,我要么需要找到一种方法来在键中找到子字符串python,要么继续从y开始上述键。

我首先尝试找到密钥首字母的每个实例,然后假设每个首字母都将是密钥的开头,然后尝试从那里构建一个字符串.CheckIO上的此问题被标记为很简单,所以我显然在某处缺少了一些东西。

这就是我所拥有的,但是效率似乎并不高,它依赖于重复输入一个单词的关键。 如果在该短语中重复字母,例如checkiocheckioch失败,它也会掉落。 有更好的方法吗?

# assumes single word repetition in string

def find_string(strTest):
    a = []
    x = []
    y = []
    for b in range(0, len(strTest)):
        a.append(strTest[b])
    for c in range(0, len(a)):
        if a[c] == a[0]:
            x.append(c)
    for d in range(0, len(x)-1):
        y.append(x[d+1] - x[d])
    if y.count(y[0]) == len(y):
        intWholeStrings = len(strTest) // x[len(x) - 1]
        return find_sub(intWholeStrings, y[0], strTest)
    else:
        return False

def find_sub(intCount, intLen, strTest):
    a1 = strTest[:2]
    for i in range(2, intLen):
        for j in range(1, intCount+1):
            if a1 in strTest[:intLen * j]:
                a1 = a1 + strTest[i]
    return a1

print(find_string('pythonpythonpythonpythonpyth'))

为了找到给定基本字符串的最大子字符串,我将使用以下方法:

import re

    def get_largest_substring(string):
        length = 0
        x = 0
        y = 0

        for y in range(len(string)):
            for x in range(len(string)):
                substring = string[y:x]
                if len(list(re.finditer(substring,string))) > 1  and len(substring) > length:
                    match = substring
                    length = len(substring)
        return match

        print get_largest_substring("pythonpythonpythonionpythonionspythonionsd")

这还允许在字符串中进行可能的更改,并且在您的算法会进行某些更改的情况下,也不会摇摆不定

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM