在列表列表中查找子字符串

Finding a substring in a list of lists

我有一个问题无法解决,我有一个包含多个列表的动态列表data(从网络请求数据),每个列表都包含字符串、整数等,但我需要包含特定文本 StreamCache 的那个。 data 中只有一个列表包含字符串 StreamCache,我将其存储在一个新列表中。几乎所有时候我的代码都能完美运行,但是当它找到一个包含 StreamCache@abnsdj12StreamCache*mljsgfn525 之类的字符串的列表时,这实际上是我需要的列表,我的代码不起作用,只是因为 StreamCacheStreamCache@kahsgsgh5 左右不完全匹配,我尝试了列表理解、正则表达式,但没有任何效果。有人能帮我吗? 这些是我的解决方案:

# Works only if 'StreamCache' matchs exactly with the iterable
temp1 = [i for i in data if 'StreamCache' in i]
################ Solution 2 that doesn't work at all
search = 'StreamCache'
for element in data:
    if isinstance(element, list):
        new = [i for i in element]
        z = re.compile('|'.join(re.escape(k) for k in new))
        result = re.findall(z, search)

希望你能帮助我。

您需要检查 StreamCache 是否是列表中任何字符串的一部分,您可以这样做:

[l for l in data if any('StreamCache' in s for s in l)]

如果StreamCache总是出现在字符串的开头,这样会更有效率:

[l for l in data if any(s.startswith('StreamCache') for s in l)]

您只尝试了第二种方法 returns [StreamCache] 因为您搜索的内容只有 StreamCache 而正则表达式对象是 <element 1>|<element 2>|....,您的意思是找到StreamCache.* 字符串在字符串中,如下例所示?

a|abc|StreamCache*mljsgfn777|123|StreamCache|aweafwfa|asfwqwdq|StreamCache@abnsdj12|somestring|StreamCache*mljsgfn525

如果是这样,我想你把参数reverse弄错了,正则表达式对象是第一个参数,搜索内容是第二个参数。下面是一个似乎为我提供预期结果的示例

search = 'a|abc|StreamCache*mljsgfn777|123|StreamCache|aweafwfa|asfwqwdq|StreamCache@abnsdj12|somestring|StreamCache*mljsgfn525' # search content
z = re.compile('StreamCache[^|]*|') # regex object
search_result = list(filter(lambda x: x, re.findall(z, search))) # use filter to remove empty strings
# search_result here would contain ['StreamCache*mljsgfn777', 'StreamCache', 'StreamCache@abnsdj12', 'StreamCache*mljsgfn525']