在列表列表中查找子字符串
Finding a substring in a list of lists
我有一个问题无法解决,我有一个包含多个列表的动态列表data
(从网络请求数据),每个列表都包含字符串、整数等,但我需要包含特定文本 StreamCache
的那个。 data
中只有一个列表包含字符串 StreamCache
,我将其存储在一个新列表中。几乎所有时候我的代码都能完美运行,但是当它找到一个包含 StreamCache@abnsdj12
或 StreamCache*mljsgfn525
之类的字符串的列表时,这实际上是我需要的列表,我的代码不起作用,只是因为 StreamCache
与 StreamCache@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']
我有一个问题无法解决,我有一个包含多个列表的动态列表data
(从网络请求数据),每个列表都包含字符串、整数等,但我需要包含特定文本 StreamCache
的那个。 data
中只有一个列表包含字符串 StreamCache
,我将其存储在一个新列表中。几乎所有时候我的代码都能完美运行,但是当它找到一个包含 StreamCache@abnsdj12
或 StreamCache*mljsgfn525
之类的字符串的列表时,这实际上是我需要的列表,我的代码不起作用,只是因为 StreamCache
与 StreamCache@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']