2016-12-02 112 views
-1

我想在模式匹配后的列表中打印前面的元素。在下面的基本示例中,我匹配列表中的字符串'foo'。我想打印出不是匹配本身('foo'),而是匹配下面的元素(在本例中为'bar')。Python中模式匹配后的打印列表元素

theList = ["foo", "bar", "baz", "qurx", "bother"] # example list 

list1 = "foo" # matching string 

regex = re.compile(list1) 

[m.group(0) for l in theList for m in [regex.search(l)] if m] # returns 'foo' 

上面的代码返回匹配,但就像我说的我想返回下面的元素在列表中。任何帮助,将不胜感激。

+0

这是非常糟糕的代码。你应该从简单的事情开始。 – hop

回答

1

当你还不确定它们是如何工作的时候,不要试图使用列表解析等聪明的东西。毕竟,使用简单的代码可读代码更容易验证。

试试这个(为了清楚起见,我离开了正则表达式废话):

haystack = ["foo", "bar", "baz", "foo", "qurx", "bother"] 
needle = "foo" 

result = [] 
for i, element in enumerate(haystack): 
    if needle in element: 
     result.append(haystack[i+1]) 

print(result) 

如果你只在第一个(或唯一)的比赛感兴趣,你可以使用

haystack = ["foo", "bar", "baz", "foo", "qurx", "bother"] 
needle = "foo" 

for i, element in enumerate(haystack): 
    if needle in element: 
     print(haystack[i+1]) 
     break 

如果你也可以匹配平等而不是使用正则表达式,这是最简单的方法:

idx = haystack.index(needle) 
result = haystack[idx+1] 

这个例子如果在大海捞针的最后位置发现了针,上面的所有内容都会中断,但我将这些作为练习留给读者。

正确实现你原来的做法,该解决方案可以是这个样子:

pairs = zip(haystack, haystack[1:]) 
[following for matching, following in pairs if needle in matching]