在for循环中获取多个关键字

时间:2017-07-23 19:56:32

标签: python regex

想要找到for循环中的关键字列表,我收到此错误:

  

TypeError:不可用类型:' list'

我的代码摘录如下:

key = ['lorem', 'ipsum', 'dolor']

for item in stringloop:
    matcher = re.compile(key, re.IGNORECASE)
    if filter(matcher.match, item):
       # Some code

2 个答案:

答案 0 :(得分:3)

从这开始:

stringloop = ['lorem 123', 'testfoo', 'dolor 456']
key = ['lorem', 'ipsum', 'dolor']

首先,您需要匹配任意一个键。使用|加入运算符。 x|y|z会查找xyz。在循环外创建对象:

matcher = re.compile('|'.join(map(re.escape, key)), re.I) # escaping possible metacharacters

在这里,我使用re.escape来逃避任何可能的正则表达式元字符。如果现有模式具有任何元字符,则可能无效。现在循环浏览stringloop,在每个项目上调用matcher.match。请勿使用filter,直接致电:

for item in stringloop:
    if matcher.match(item):
        print(item)

这给出了:

lorem 123
dolor 456

对于具有自己的元字符的复杂模式,您应该在模式列表中单独编译每个模式:

matchers = [re.compile(pat, re.I) for pat in key]

然后你会稍微修改你的循环:

for item in stringloop:
    for m in matchers:    
        if m.match(item):
            print(item)
            break

这也有效,给出:

lorem 123
dolor 456

但由于嵌套循环,它速度较慢。

作为结束注释,如果你的键是简单的字符串,我会选择str.startswith,因为它也会做同样的事情,检查字符串是否以某个子字符串开头:

for item in stringloop:
    if item.lower().startswith(tuple(key)):
        print(item)

可悲的是,这也给出了:

lorem 123
dolor 456

答案 1 :(得分:-1)

我认为你要做的是以下几点:

n3[t] = (i1[t]*a + n6[t-1]*e)*d + i2[t]*b*c) * f

这使用key = ['lorem', 'ipsum', 'dolor'] finallist = [] for item in stringloop: for regex in key: if re.match(regex, item): finallist.append(item) # Some code 的每个元素作为正则表达式来匹配key中的每个字符串元素。正如COLDSPEED所指出的那样,在循环中编译一次使用就完全没有编译它的目的,所以只需在匹配中直接使用它们。然后,代替stringloop,只需在循环中构建一个最终列表。