在字符串中查找子序列

6 投票
3 回答
5340 浏览
提问于 2025-04-16 03:53

我想写一个函数,用来检查一个字符串里面是否包含其他字符串。
不过,被检查的子字符串可能会被主字符串中的其他字母打断。

举个例子:

a = 'abcde'
b = 'ace'
c = 'acb'

这个函数应该返回 ba 里面,但 c 不在里面。

我已经试过用 set(a). intersection(set(b)),但我的问题是,它错误地把 c 也算在 a 里面。

3 个回答

3

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常会把它们转换成一种特定的格式,这样程序才能顺利地进行处理。

比如说,如果我们从一个网页上获取了一些信息,这些信息可能是以文本的形式存在的。为了让程序能够使用这些信息,我们可能需要把它们转换成一个更容易操作的格式,比如列表或者字典。这样,我们就能更方便地对这些数据进行增删改查。

在这个过程中,可能会遇到一些问题,比如数据格式不对、缺少必要的信息等等。这时候,我们就需要仔细检查数据,确保它们符合我们需要的格式,才能顺利进行后续的操作。

总之,处理数据就像整理房间一样,只有把东西放在合适的位置,才能找到并使用它们。

def issubstr(s1, s2):
    return "".join(x for x in s2 if x in  s1) == s1

>>> issubstr('ace', 'abcde')
True

>>> issubstr('acb', 'abcde')
False
5

这样做怎么样呢...

def issubstr(substr, mystr, start_index=0):
    try:
        for letter in substr:
            start_index = mystr.index(letter, start_index) + 1
        return True
    except: return False

或者...

def issubstr(substr, mystr, start_index=0):
    for letter in substr:
        start_index = mystr.find(letter, start_index) + 1
        if start_index == 0: return False
    return True
11

你可以把你想要的字符顺序变成一个正则表达式(regex):

import re

def sequence_in(s1, s2):
    """Does `s1` appear in sequence in `s2`?"""
    pat = ".*".join(s1)
    if re.search(pat, s2):
        return True
    return False

# or, more compactly:
def sequence_in(s1, s2):
    """Does `s1` appear in sequence in `s2`?"""
    return bool(re.search(".*".join(s1), s2))

a = 'abcde' 
b = 'ace' 
c = 'acb'

assert sequence_in(b, a)
assert not sequence_in(c, a)

比如说“ace”就会变成正则表达式“a.*c.*e”,这个表达式的意思是找到这三个字符按顺序出现,中间可以有其他字符插入。

撰写回答