在Python中,我想测试Linux命令输出中是否存在关键字。要测试的关键字将作为列表传递,如下所示。我没有花太多时间使用Python,所以蛮力方法如下。是否有更清晰的方式来写这个?
def test_result (result, mykeys):
hit = 0
for keyword in mykeys:
if keyword in result:
hit = 1
print "found a match for " + keyword
if hit == 1:
return True
result = "grep says awk"
mykeys = ['sed', 'foo', 'awk']
result = test_result (result, mykeys)
答案 0 :(得分:4)
内置的any
会执行此操作。
def test_result(result, mykeys):
return any(key in result for key in mykeys)
答案 1 :(得分:2)
您可以使用正则表达式来完成此任务。 a|b|c
形式的正则表达式与a
,b
或c
中的任何一个匹配。所以,你需要一些形式:
import re
p = re.compile('|'.join(mykeys))
return bool(p.search(result))
p.search(result)
在整个字符串中搜索正则表达式的匹配项;如果存在,它返回一个匹配(即true-y),否则返回None
(这是假y)。将结果转换为bool
,如果匹配则为True
,否则为False
。
把这些放在一起,你就有了:
import re
def test_result(result, mykeys):
p = re.compile('|'.join(mykeys))
return bool(p.search(result))
您还可以通过不预编译正则表达式来使其更简洁;如果是一次性使用,这应该没问题:
def test_result(result, mykeys):
return bool(re.search('|'.join(mykeys), result))
供参考,请阅读Python's re
library。
答案 2 :(得分:2)
你的功能做了两件事,打印并返回结果。你可以这样打破它们:
def test_result(result, mykeys):
return [k in result for k in mykeys]
def print_results(results):
for result in results:
print("found a match for " + result)
test_result
将返回包含所有找到的键或空列表的列表。空列表是假的,因此您可以将它用于您想要的任何测试。只有在你真正想要打印时才需要print_results,否则你可以在其他函数中使用结果。
如果您只想查看在线状态并且不关心您找到的密钥,可以执行以下操作:
def test_result(result, my_keys):
return any(map(lambda k: k in result, mykeys))
如果您正在使用python3(就像您应该这样),我相信这将是懒惰的,并且只根据需要评估列表的大部分内容。
有关此最后一项功能的更简洁版本,请参阅A more concise way to write this Python code。
答案 3 :(得分:0)
要搜索列表中的元素,可以使用for-else
语句。特别是,这允许返回找到的元素。
def test_result (result, mykeys):
for keyword in mykeys:
if keyword in result: break
else:
return None
return keyword
print(test_result("grep says awk", ['sed', 'foo', 'awk'])) # 'awk'
print(test_result("grep says awk", ['bar', 'foo'])) # None