如何从字符串中找到子字符串列表的位置?
给定一个字符串:
这架飞往圣彼得堡的飞机上周六从沙姆沙伊赫起飞仅23分钟后就在埃及西奈沙漠坠毁。
和子字符串列表:
[“The”、“plane”、“,”、“bound'、”for“、”St“、”Petersburg“、”,“、”crashed“、”in“、”Egypt“、”s”、“Sinai”、“desert”、“just'、”23“、”minutes“、”after“、”take-off“、”from“、”Sharm“、”el-Sheikh“、”on“、”Saturday“、”.“]
预期输出:
>>> s = "The plane, bound for St Petersburg, crashed in Egypt's Sinai desert just 23 minutes after take-off from Sharm el-Sheikh on Saturday."
>>> tokens = ['The', 'plane', ',', 'bound', 'for', 'St', 'Petersburg', ',', 'crashed', 'in', 'Egypt', "'s", 'Sinai', 'desert', 'just', '23', 'minutes', 'after', 'take-off', 'from', 'Sharm', 'el-Sheikh', 'on', 'Saturday', '.']
>>> find_offsets(tokens, s)
[(0, 3), (4, 9), (9, 10), (11, 16), (17, 20), (21, 23), (24, 34),
(34, 35), (36, 43), (44, 46), (47, 52), (52, 54), (55, 60), (61, 67),
(68, 72), (73, 75), (76, 83), (84, 89), (90, 98), (99, 103), (104, 109),
(110, 119), (120, 122), (123, 131), (131, 132)]
解释输出,第一个子串“The”可以通过使用字符串s
使用(start, end)
索引找到。因此从所需的输出。
因此,如果我们循环遍历所需输出中的所有整数元组,我们将返回子字符串列表,即。
>>> [s[start:end] for start, end in out]
['The', 'plane', ',', 'bound', 'for', 'St', 'Petersburg', ',', 'crashed', 'in', 'Egypt', "'s", 'Sinai', 'desert', 'just', '23', 'minutes', 'after', 'take-off', 'from', 'Sharm', 'el-Sheikh', 'on', 'Saturday', '.']
我试过了
def find_offset(tokens, s):
index = 0
offsets = []
for token in tokens:
start = s[index:].index(token) + index
index = start + len(token)
offsets.append((start, index))
return offsets
有没有其他方法可以从字符串中找到子字符串列表的位置?
4条答案
按热度按时间58wvjzkj1#
第一个解决方案:
第二个解决方案用于更正第一个解决方案中的问题:
wh6knrhe2#
结果
ffdz8vbo3#
如果我们对子字符串一无所知,除了重新扫描整个文本以查找每个子字符串之外,别无他法。
如果像数据显示的那样,我们知道这些是文本的连续片段,按照文本顺序给出,那么在每次匹配后只扫描文本的“其余部分”就很容易了,但没有必要每次都剪切文本。
试验:
这里假设每个片段都出现在文本的正确位置。您的输出格式没有提供不匹配报告的示例。使用
.find
代替.index
可能会有所帮助,尽管只是部分帮助。w7t8yxp54#
这比下面的方法效果更好:
试验: