在字符串中查找子序列
我想写一个函数,用来检查一个字符串里面是否包含其他字符串。
不过,被检查的子字符串可能会被主字符串中的其他字母打断。
举个例子:
a = 'abcde'
b = 'ace'
c = 'acb'
这个函数应该返回 b
在 a
里面,但 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”,这个表达式的意思是找到这三个字符按顺序出现,中间可以有其他字符插入。