识别 Python 中的子字符串(沿字符串中的索引移动)

我是 Python 和编码的新手,并且坚持将子字符串与另一个字符串进行比较。


我有:字符串 sq 和模式 STR。


目标:我正在尝试计算连续出现在该字符串中的 STR 模式的最大数量。


这是代码的一部分:


 STR = key

        counter = 0

        maximum = 0


        for i in sq:

            while sq[i:i+len(STR)] == STR:

                counter += 1

                i += len(STR)

问题似乎出现在“while部分”,说TypeError: can only concatenate str (not "int") to str。


我看到它将i视为字符,将len(STR)视为 int,但我不知道如何解决此问题。这个想法是取第一个等于 STR 长度的子串,然后判断这个子串和 STR 模式是否相同。


函数式编程
浏览 74回答 2
2回答

守着星空守着你

通过循环使用:for i in sq:您正在遍历.sq相反,如果您希望变量i遍历 的可能索引,sq您通常会遍历range(len(sq)),以便从0到获取值len(sq) - 1。for i in range(len(sq)):但是,在这种情况下,您想要分配给i循环内部:i += len(STR)如果您正在循环,这将不会产生预期的效果,range(...)因为在下一次迭代中它将被分配给来自 的下一个值range,忽略添加的增量。通常,不应在循环内分配给循环变量。因此,它可能最容易通过循环实现,并且您显式while设置所需的值(在重新启动循环之前进行初始化),然后您可以在循环内进行任何其他赋值。ii=0i+=1STR = "ell"sq = "well, well, hello world"counter = 0i = 0while i < len(sq):&nbsp; &nbsp; while sq[i:i+len(STR)] == STR:&nbsp; # re use of while here, see comments&nbsp; &nbsp; &nbsp; &nbsp; counter += 1&nbsp; &nbsp; &nbsp; &nbsp; i += len(STR)&nbsp; &nbsp; i += 1print(counter)&nbsp; # prints 3(您也许可以保存len(sq)并保存len(STR)在其他变量中以保存重复评估它们。)

料青山看我应如是

此解决方案不使用 afor因此增量可以在不匹配时增加一个,在匹配时增加字符串长度。任何不匹配记录到目前为止看到的最大计数并重置计数。def count_max(string,key):&nbsp; &nbsp; if len(key) > len(string):&nbsp; &nbsp; &nbsp; &nbsp; return 0&nbsp; &nbsp; last = len(string) - len(key)&nbsp; &nbsp; i = 0&nbsp; &nbsp; count = 0&nbsp; &nbsp; maximum = 0&nbsp; &nbsp; while i <= last:&nbsp; &nbsp; &nbsp; &nbsp; if string[i:i+len(key)] == key:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count += 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i += len(key)&nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; maximum = max(maximum,count)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i += 1&nbsp; &nbsp; return max(maximum,count)key = 'abc'strings = 'ab','abc','ababcabc','abcdefabcabc','abcabcdefabc'for string in strings:&nbsp; &nbsp; print(count_max(string,key))输出:01222这里还有一个可能更快的版本。对于短字符串,它并不快,但如果字符串很长,它会快得多,因为正则表达式会比 Python 循环更快地找到匹配项。def count_max2(string,key):&nbsp; &nbsp; return max([len(match) // len(key)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for match in re.findall(rf'(?:{re.escape(key)})+',string)]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;,default=0)怎么运行的:re.escape是一个确保字符按key字面意义而不是正则表达式语法的函数。例如,允许搜索+,而不是被视为“一个或多个”匹配项。rf''是原始f 字符串(格式字符串)的语法。建议对正则表达式使用“raw”,因为表达式的某些语法会与其他 Python 语法混淆。f-strings 允许使用大括号将变量和函数插入到字符串中{}。re.findall查找字符串中的所有连续匹配项。[f(x) for x in iterable]是一个列表推导式,获取从 iterable 返回的列表,并计算列表中每个项目的函数。在这种情况下,如果用匹配的长度除以键的长度来得到键的出现次数。max(iterable,default=0)返回 iterable 的最大值,如果 iterable 为空(无匹配项)则返回 0。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python