想要找到for
循环中的关键字列表,我收到此错误:
TypeError:不可用类型:' list'
我的代码摘录如下:
key = ['lorem', 'ipsum', 'dolor']
for item in stringloop:
matcher = re.compile(key, re.IGNORECASE)
if filter(matcher.match, item):
# Some code
答案 0 :(得分:3)
从这开始:
stringloop = ['lorem 123', 'testfoo', 'dolor 456']
key = ['lorem', 'ipsum', 'dolor']
首先,您需要匹配任意一个键。使用|
加入运算符。 x|y|z
会查找x
或y
或z
。在循环外创建对象:
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
,只需在循环中构建一个最终列表。