查找位于列表中特定字符串之间的字符串 Python

Find Strings Located Between Specific Strings in List Python

我正在编写从网站提取数据的代码,它会打印出某些标签之间的所有文本。每次代码从标签中提取数据时,我都会将结果存储到一个列表中,所以我有一个看起来像

的列表
Warning
Not
News
Legends
Name1
Name2
Name3
Pickle
Stop
Hello

我想查看这个字符串列表并使用代码找到关键字 legendspickle 并打印它们之间的任何字符串。

为了进一步详细说明 activity,我可能会创建一个包含所有可能 legend names 的完整列表,然后,如果它们在我生成列表时出现,则将再次出现的那些打印出来。对这些问题有任何见解吗?

您可以使用 list.index() 方法查找列表中项目的数字索引,然后使用列表切片 return 列表中位于这两点之间的项目:

your_list = ['Warning','Not','News','Legends','Name1','Name2','Name3','Pickle','Stop','Hello']
your_list[your_list.index('Legends')+1:your_list.index('Pickle')]

需要注意的是 .index() return 只是给定项目第一次出现的索引,因此如果您的列表有两个 'legends' 项目,您将只 return第一个索引。

试试这个:

words = [
    "Warning", "Not", "News", "Legends", "Name1",
    "Name2", "Name3", "Pickle", "Stop", "Hello"
]
words_in_between = words[words.index("Legends") + 1:words.index("Pickle")]
print(words_in_between)

输出:

['Name1', 'Name2', 'Name3']

这假设 "Legends""Pickle" 在列表中只出现一次。

对于第二种方法,您可以创建预期匹配名称的正则表达式交替,然后使用列表理解生成匹配列表:

tags = ['Warning', 'Not', 'News', 'Legends', 'Name1', 'Name2', 'Name3', 'Pickle', 'Stop', 'Hello']
names = ['Name1', 'Name2', 'Name3']
regex = r'^(?:' + r'|'.join(names) + r')$'
matches = [x for x in tags if re.search(regex, x)]
print(matches)  # ['Name1', 'Name2', 'Name3']

您可以使用 list.index() 获取 legendspickle 第一次出现的索引。然后你可以使用 list slicing 来获取介于

之间的元素
l = ['Warning','Not','News','Legends','Name1','Name2','Name3','Pickle','Stop','Hello']
l[l.index('Legends')+1 : l.index('Pickle')]
['Name1', 'Name2', 'Name3']

numpys 函数为您提供给定项目的所有出现。所以首先让 lsit 成为一个 numpy 数组

my_array = numpy.array(["Warning","Not","News","Legends","Name1","Name2","Name3","Pickle","Stop","Hello","Legends","Name1","Name2","Name3","Pickle",])

从这里开始你可以使用numpy的方法了:

legends = np.where(my_array == "Legends")
pickle = np.where(my_array == "Pickle")

连接更容易循环

stack = np.concatenate([legends, pickle], axis=0)

寻找图例和 pickle 之间的值

np.concatenate([my_list[stack[0, i] + 1:stack[1, i]] for i in range(stack.shape[0])] )

我的结果是:

array(['Name1', 'Name2', 'Name3', 'Name1', 'Name2'], dtype='<U7')