我有一个列表类型的对象和第二个字符串类型的对象。 我想过滤列表对象中与字符串对象的值不匹配的所有值。
我创建了一个循环,将列表分成字符串,并用正则表达式找到了所有不匹配的内容,并将这些结果添加到了新列表中。 本示例使用主机名“ ma-tsp-a01”,“ ma-tsp-a02”和“ ma-tsp-a03”。 目前,我会在这个新列表上做进一步的工作,以创建干净的主机名列表。
import re
local_hostname = 'ma-tsp-a01'
profile_files = ['/path/to/file/TSP_D01_ma-tsp-a01\n', \
'/path/to/file/TSP_D02_ma-tsp-a02\n', \
'/path/to/file/TSP_ASCS00_ma-tsp-a01\n', \
'/path/to/file/TSP_DVEBMGS03_ma-tsp-a03\n', \
'/path/to/file/TSP_DVEBMGS01_ma-tsp-a01\n']
result_list = [local_hostname]
for list_obj in profile_files:
if re.search(".*\w{3}\_\w{1,7}\d{2}\_(?!"+local_hostname+").*", list_obj):
result_list.append(list_obj.split("/")[-1].splitlines()[0].\
split("_")[-1])
print(result_list)
最后我得到以下输出
['ma-tsp-a01', 'ma-tsp-a02', 'ma-tsp-a03']
。这正是我要搜索的内容。但是有没有办法在没有“ for”循环的情况下以更Python化的方式做到这一点?
答案 0 :(得分:2)
您可以创建一个filter
对象:
filtered = filter(lambda x: re.search(".*\w{3}\_\w{1,7}\d{2}\_(?!"+local_hostname+").*", x), profile_files)
或使用生成器理解:
filtered = (x for x in profile_files if re.search(".*\w{3}\_\w{1,7}\d{2}\_(?!"+local_hostname+").*", x))
两者的行为相同