为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

函数式编程 2023-02-07 10:44:35
我是 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 模式是否相同。
查看完整描述

2 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

通过循环使用:


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+=1


STR = "ell"

sq = "well, well, hello world"


counter = 0


i = 0

while i < len(sq):

    while sq[i:i+len(STR)] == STR:  # re use of while here, see comments

        counter += 1

        i += len(STR)

    i += 1


print(counter)  # prints 3

(您也许可以保存len(sq)并保存len(STR)在其他变量中以保存重复评估它们。)


查看完整回答
反对 回复 2023-02-07
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

此解决方案不使用 afor因此增量可以在不匹配时增加一个,在匹配时增加字符串长度。任何不匹配记录到目前为止看到的最大计数并重置计数。


def count_max(string,key):


    if len(key) > len(string):

        return 0


    last = len(string) - len(key)

    i = 0

    count = 0

    maximum = 0


    while i <= last:

        if string[i:i+len(key)] == key:

            count += 1

            i += len(key)

        else:

            maximum = max(maximum,count)

            count = 0

            i += 1

    return max(maximum,count)


key = 'abc'

strings = 'ab','abc','ababcabc','abcdefabcabc','abcabcdefabc'


for string in strings:

    print(count_max(string,key))

输出:


0

1

2

2

2

这里还有一个可能更快的版本。对于短字符串,它并不快,但如果字符串很长,它会快得多,因为正则表达式会比 Python 循环更快地找到匹配项。


def count_max2(string,key):

    return max([len(match) // len(key)

                for match in re.findall(rf'(?:{re.escape(key)})+',string)]

               ,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。


查看完整回答
反对 回复 2023-02-07
  • 2 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信