【问题标题】:Finding a substring inside of a string and its slice?在字符串及其切片中查找子字符串?
【发布时间】:2011-04-28 03:25:35
【问题描述】:

我一直试图帮助我的朋友完成他的任务,但我什至不知道从哪里开始。我可以让它识别字符串内部的子字符串,但给出它的开始位置让我很困扰。我已经做了好几个小时了。欢迎任何帮助。这是我对以下任务的所有了解。

附言。他的整个班级都不知道如何做到这一点。老师给了他们一些超出他们和我的联盟的方法。

编写一个程序,要求用户输入两个字符串 stringA 和 stringB。

  1. 程序必须首先找到stringA中出现stringB的所有起始位置。

    例如,如果 stringA 是“the car is in that carport”,并且 stringB 是“car”,程序应该报告 stringB 出现在 stringA 中,从位置 4 和 19 开始 (记住字符串 从位置 0 开始)。

  2. 接下来程序必须找到 stringA 中的所有起始位置,其中 stringB 几乎出现了。

    • “几乎”的意思是 stringB 的其中一个字母不 匹配。
    • 例如 如果 stringA 与上面相同,并且 stringB 为“the”,则程序 应该报告 stringB 几乎从位置 14 开始出现,这是 字符串“tha”。
    • 通知 它没有报告它几乎从位置 0 开始出现, 既然出现了 与零错配。
  3. 最后,程序必须找到stringA中的所有起始位置 哪里相反 stringB 出现。

    • 例如,如果 stringA 与上面相同,并且 stringB 是“rop”,那么 程序应该报告 stringB 的反转出现在 stringA 从位置 22 开始。

程序 equalsubstrings.py 有助于理解如何 编写这个程序。

【问题讨论】:

    标签: python string indexing substring


    【解决方案1】:
    stringA = "the car is in that carport"
    stringB = "the"
    
    exact = []
    reverse = []
    almost = []
    
    lenA = len(stringA)
    lenB = len(stringB)
    limit = lenA - lenB
    reversedB = stringB[::-1]
    
    pos = stringA.find(stringB)
    while pos >= 0:
        exact.append(pos)
        pos = stringA.find(stringB, pos + 1)
    
    pos = stringA.find(reversedB)
    while pos >= 0:
        exact.append(pos)
        pos = stringA.find(reversedB, pos + 1)
    
    for i in range(limit):
        substrA = stringA[i:i+lenB]
        misses = 0
        for j in range(lenB):
            if substrA[j] != stringB[j]:
                misses += 1
        if misses == 1:
            almost.append(i)
    
    print exact, almost, reverse
    

    【讨论】:

    • 小心,你即将从作业巡逻中获得一些反对票。
    • @DTing:是的,也许吧。我只是认为额外的间接性(我们向试图帮助的人提供提示)会使我们说的任何话都变得毫无意义。
    【解决方案2】:

    我给你两条线索:

    为了检查一个字符串是否是另一个字符串的子字符串,你可以这样做:

    1. 使用find:

    a="这是一个测试"

    b="测试"

    a.find(b,0,14)

    10

    1. 使用运算符in,如下例所示:

    a="这是一个测试" b="测试" c="不相关的文字" b在一个 真的 b 在 c 假的

    要反转字符串,请执行以下操作:

    >>> a="this is a test"
    >>> a[::-1]
    'tset a si siht'
    

    祝你作业顺利

    【讨论】:

    • in 不如string#find 有用。
    【解决方案3】:

    我会使用re 模块。

    • re.finditer 允许您遍历字符串中子字符串的所有匹配项。
    • 每个匹配项都会为您提供一个“匹配对象”。
    • 在任何匹配对象上使用mo.start() 以查找该匹配项在字符串中的索引。
    • 对于“几乎”匹配,逐个字符地检查 stringB,将当前字符替换为 [^<current_character>],然后对每个生成的正则表达式重复匹配过程,记录所有匹配项。
    • 最后,使用 stringB 的反向进行简单搜索(参见其他地方)。

    这种方法的好处:您可以很好地掌握re :-)。

    顺便说一句:神秘的equalsubstrings.py 程序是什么? ;-)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-27
      • 2011-07-13
      • 2015-04-28
      • 1970-01-01
      • 2021-08-13
      • 2015-10-28
      相关资源
      最近更新 更多