python-3.x 有没有比一个一个地看一串字母更好的方法来查找一串字母,并找到一组字母的模式?

y0u0uwnf  于 2023-03-31  发布在  Python
关注(0)|答案(2)|浏览(112)

假设我有一个字符串a,里面可能是"h.e.l.l.o.""h.e...l.l...o."甚至"h.e..l..o"。实际上任何一系列的小写字母都可以在那里。(我使用.作为任何随机字母的占位符,只是为了让它看起来更清晰)
我想遍历字符串,看看字母hello(按此顺序)是否存在于该字符串中的任何位置,并将位置返回给我。
下面是我的代码:

import random as r
a = r.choice("hellooooo","hheelllloo","vhweclgljom","hqleeldo","hueqlbo")
"             hello       h e ll  o     h e l l o    h le l o   h e l o"
# notice the first three all have "hello" in order inside the string somewhere, and the last two don't

if "h" in a:
    i = a.index("h")
    if "e" in a[i:]:
        j = a[i:].index("e")
        if "l" in a[j:]:
            k = a[j:].index("l")
            if "l" in a[k:]:
                l = a[k:].index("l")
                if "o" in a[l:]:
                    m = a[l:].index("o")
                    print("found at",i,j,k,l,m)

我并不特别希望在我的代码中出现这样一个疯狂的楼梯。另一种方法是循环通过它,但这要慢得多。有没有其他方法可以有效地做到这一点?

efzxgjgh

efzxgjgh1#

您可以通过将文本转换为迭代器来实现花哨而简洁的效果:

def find(text, pattern):
    i = iter(text)
    return all(char in i for char in pattern)

这利用了成员资格测试仅将迭代器向前移动所需的距离(即查找之后的索引)的事实。

>>> find("foohbarelbaloz", "hello")
True
>>> find("foohbarelbalz", "hello")
False

而这一点,实际上,确实执行了正确的顺序:

>>> find("olleh", "hello")
False

要找到实际的索引,可以使用str.find(sub[, start[, end]])

def find(text, pattern):
    res, i = [], -1
    for char in pattern:
        i = text.find(char, i+1) 
        if i < 0:
            raise IndexError("Not found")
        res.append(i)
    return res

>>> find("foohbarelbaloz", "hello")
[3, 7, 8, 11, 12]
3pmvbmvn

3pmvbmvn2#

循环绝对是一种方法--您只需要在字符串中循环一次(请注意,每次调用index都会在字符串中循环一次,因此多次调用index并不能真正避免循环)。

def find_hidden_word(needle, haystack):
    matches = []
    for i, char in enumerate(haystack):
        if not needle:
            break
        if char == needle[0]:
            needle = needle[1:]
            matches.append(i)
    return [] if needle else matches

print(find_hidden_word("hello", "vhweclgljom"))
# [1, 3, 5, 7, 9]

相关问题