Python 在字符串列表中搜索多个关键字

Python 在字符串列表中搜索多个关键字,python,Python,我有两个python列表,一个是关键字列表,另一个是文件名列表。我需要根据我拥有的关键字解析文件名列表。我希望python将文件名与关键字匹配,然后根据匹配的关键字执行操作 我所拥有的是这样的: keywords = ["_CMD_","_COMM_","_RETRANSMIT_"] file_list = ['2B_CMD_2015.txt','2C_CMD_2015.txt','RETRANSMIT_2015.txt'] for f_name in file_list: for key

我有两个python列表,一个是关键字列表,另一个是文件名列表。我需要根据我拥有的关键字解析文件名列表。我希望python将文件名与关键字匹配,然后根据匹配的关键字执行操作

我所拥有的是这样的:

keywords = ["_CMD_","_COMM_","_RETRANSMIT_"]
file_list = ['2B_CMD_2015.txt','2C_CMD_2015.txt','RETRANSMIT_2015.txt']

for f_name in file_list:
  for keyword in keywords:
    if keyword in f_name:
      #perform operation based on what keyword is matched
    else:
      #print an error
我遇到的问题是,由于它循环遍历关键字,它会打印一个错误,直到找到文件名中的关键字,然后执行操作,但我只希望它在搜索的文件名中没有找到任何关键字时打印一个错误

我尝试使用
any()
,但在找到匹配项后,它似乎停止了检查文件。例如,使用

for keyword in keywords:
  if any(keyword in f_name for f_name in file_list):
    print f_name
    print keyword
返回

2B_CMD_2015.txt
_CMD_
2B_CMD_2015.txt
_RETRANSMIT_
这是不对的

编辑 还尝试使用regex,但不确定是否正确:

for keyword in keywords:
  for item in wordlist:
    if re.search(keyword,item) is not None:
        print keyword
        print item
    else:
        print "nope"
返回:

nope
nope
nope
_CMD_
2B_CMD_2015.txt
_CMD_
2C_CMD_2015.txt
nope
nope
nope
_RETRANSMIT_
_RETRANSMIT_2015.txt
nope
nope
nope

有人能帮我解决这个问题吗?我觉得应该不会这么难。

因为其他的
可以帮助你。如果内部
for
循环未中断,则将执行
else
子句,这只有在找到匹配项时才会发生。请注意,这意味着只考虑第一个匹配项,而不会寻找更多匹配项

keywords = ["_CMD_","_COMM_","_RETRANSMIT_"]
file_list = ['2B_CMD_2015.txt','2C_CMD_2015.txt','RETRANSMIT_2015.txt']

for f_name in file_list:
  for keyword in keywords:
    if keyword in f_name:
      #perform operation based on what keyword is matched
      break
  else:
    #print an error
考虑使用而不是:


请注意缩进级别。
else
块与的
匹配,而不是
if
。另请注意,如果要避免对else执行

if
必须以
break
结尾,请使用
any
过滤列表,然后使用它:

keywords = ["_CMD_","_COMM_","_RETRANSMIT_"]
file_list = ['2B_CMD_2015.txt','2C_CMD_2015.txt','RETRANSMIT_2015.txt']
filtered = [file_name for file_name in file_list if any(keyword in file_name for keyword in keywords)]
if filtered:
    # do stuff with 'filtered'
    print("processing files...")
else:
    print("error")
例如:

>>> keywords = ["_CMD_","_COMM_","_RETRANSMIT_"]
>>> file_list = ['2B_CMD_2015.txt','2C_CMD_2015.txt','RETRANSMIT_2015.txt']
>>> filtered = [file_name for file_name in file_list if any(keyword in file_name for keyword in keywords)
...
... ]
>>> filtered
['2B_CMD_2015.txt', '2C_CMD_2015.txt']

执行此操作的基本方法是设置一个标志:

for f_name in file_list:
    flag = False
    for keyword in keywords:
        if keyword in f_name:
            flag = True
            #perform operation based on what keyword is matched
    if not flag:
        #print an error

我建议创建一个元组列表,将每个关键字与处理程序耦合起来。您可以使用
for..else
构造来处理不匹配的文件。考虑一下:

def handleCmd(fn):
    print "handleCmd: " + fn

def handleComm(fn):
    print "handleComm: " + fn

def handleRetransmit(fn):
    print "handleRetransmit: " + fn

keywords = [ ( "_CMD_", handleCmd ),
             ( "_COMM_", handleComm ),
             ( "RETRANSMIT_", handleRetransmit ),
           ]


file_list = ['2B_CMD_2015.txt','2C_CMD_2015.txt','RETRANSMIT_2015.txt','bogus.t>

for fn in file_list:
    for kw, handle in keywords:
        if kw in fn:
            handle(fn)
            break
    else:
        print "OH NOE"
这张照片

handleCmd: 2B_CMD_2015.txt
handleCmd: 2C_CMD_2015.txt
handleRetransmit: RETRANSMIT_2015.txt
OH NOE

事实并非如此。你让事情变得更复杂了。您听说过regex吗?@awbemauler请查看我的编辑。在它找到关键字并执行操作后,您希望它立即移动到下一个关键字,还是继续搜索?您可能需要再次检查
文件列表
分配。
handleCmd: 2B_CMD_2015.txt
handleCmd: 2C_CMD_2015.txt
handleRetransmit: RETRANSMIT_2015.txt
OH NOE