在字符串中搜索给定键

时间:2016-11-18 20:33:44

标签: python python-2.7

我已经进行了一些CodeEval次挑战,并在hard标签上遇到了一个。

  

你有两个字符串。确定第二个字符串是否是第一个字符串的子字符串(不要使用任何substr类型库函数)。第二个字符串可能包含星号(),应将其视为正则表达式,即匹配零个或多个字符。星号可以通过\ char进行转义,在这种情况下,它应该被解释为常规' '字符。总结一下:字符串可以包含字母,数字,*和\字符。

因此,您在文件中看到两个字符串,如下所示:Hello,ell您的工作是确定ell是否在hello中,我做了什么:

我还没有完美地完成它,但我确实已经达到它通过的程度并且完成了65%。它如何在字符串和键中运行,并检查字符是否匹配。如果字符匹配,则将字符附加到列表中。在此之后,它将字符串的长度除以2,并检查列表的长度是否大于或等于字符串的一半。我认为字符串长度的一半足以验证它是否确实匹配。它的工作原理示例:

h == e -> no
e == e -> yes -> list
l == e -> no
l == e -> no
...

我的问题是,我可以做些什么来更好地验证上述通配符?

import sys


def search_string(string, key):
    """ Search a string for a specified key.
    If the key exists out put "true" if it doesn't output "false"
    >>> search_string("test", "est")
    true
    >>> search_string("testing", "rawr")
    false"""
    results = []
    for c in string:
        for ch in key:
            if c == ch:
                results.append(c)
    if len(string) / 2 < len(results) or len(string) / 2 == len(results):
        return "true"
    else:
        return "false"


if __name__ == '__main__':
    with open(sys.argv[1]) as data:
        for line in data.readlines():
            data_list = line.rstrip().split(",")
            search_key = data_list[1]
            word = data_list[0]
            print(search_string(word, search_key))

1 个答案:

答案 0 :(得分:1)

我想出了解决这个问题的方法。您已经说过“不要使用任何子类型库函数”,我不确定我是否允许使用某些函数,所以告诉我是否违反了任何规则: d

希望这可以帮助你:)

def search_string(string, key):
    key = key.replace("\\*", "<NormalStar>") # every \* becomes <NormalStar>
    key = key.split("*") # splitting up the key makes it easier to work with
    #print(key)

    point = 0 # for checking order, e.g. test = t*est, test != est*t
    found = "true" # default
    for k in key:
        k = k.replace("<NormalStar>", "*") # every <NormalStar> becomes *
        if k in string[point:]: # the next part of the key is after the part before
            point = string.index(k) + len(k) # move point after this
        else: # k nbt found, return false
            found = "false"
            break

    return found


print(search_string("test", "est"))       # true
print(search_string("t....est", "t*est")) # true
print(search_string("n....est", "t*est")) # false
print(search_string("est....t", "t*est")) # false
print(search_string("anything", "*"))     # true
print(search_string("test", "t\*est"))    # false
print(search_string("t*est", "t\*est"))   # true
相关问题