使用正则表达式过滤元组列表的列表

时间:2014-02-20 19:36:56

标签: python regex tuples list-comprehension

查看底部附近的编辑

我只是在学习python。我正在尝试过滤元组列表的列表,只保留包含与正则表达式匹配的元组的列表。

基本上我有:

start_list=[[(blah1,123)],[(xblah2,123)],[(somethingelse1,123)],[(wookie1,123)]]

我希望对元组索引0中包含“blah”的任何内容进行正则表达式过滤 预期结果:

result_list=[[(blah1,123)],[(xblah2,123)]]

到目前为止我所拥有的:

import re
result_list=[[tup for tup in sub_list if re.search('.*blah.*',tup[0])] for sub_list in start_list]

但是我一直在使用正则表达式错误

  File "/usr/lib/python2.7/re.py", line 137, in match
    return _compile(pattern, flags).match(string)
TypeError: expected string or buffer

最重要的是,我担心这将返回与正则表达式不匹配的元组的空白列表。感谢任何帮助,谢谢!

编辑:好吧,我尝试更简单地解决问题导致我犯了排版错误等等。我道歉。我正在使用pysnmp getbulk,我只想获得与基础oid相匹配的结果。这是我打印元组列表列表时得到的结果:

[[(ObjectName(1.3.6.1.2.1.4.24.7.1.7.1.4.172.16.0.100.32.2.0.16777724.1.4.172.16.0.89), Integer(16777724))], [(ObjectName(1.3.6.1.2.1.4.24.7.1.7.1.4.172.16.0.100.32.2.0.16777724.1.4.172.16.0.90), Integer(16777724))], [(ObjectName(1.3.6.1.2.1.4.24.7.1.7.1.4.172.16.0.160.27.2.0.16778357.0.0), Integer(16778357))], [(ObjectName(1.3.6.1.2.1.4.24.7.1.7.1.4.172.16.0.192.29.2.0.16778348.0.0), Integer(16778348))]]

我刚刚意识到这个ObjectName事物不是一个字符串所以我想我不能在它上面使用正则表达式。但我确实希望过滤具有与基本oid匹配的ObjectName的元组:

1.3.6.1.2.1.4.24.7.1.7.1.4.172.16.0.100.32

我需要谷歌这个ObjectName现在是什么......

5 个答案:

答案 0 :(得分:1)

除了最后两个列表不包含元组之外,还必须以其他方式执行for循环。

[tup for sublist in start_list for tup in sublist]

答案 1 :(得分:0)

Regexp只能用于字符串。你应该把你的元组写成(“xblah2”,123)。

答案 2 :(得分:0)

假设一个(string,int)元组列表:

start_list = [("blah1",123),("xblah2",123),("somethingelse1",123),("wookie1",123)]

您可以使用in进行检查,而不是使用正则表达式。

result_list = [t for t in start_list if "blah" in t[0]]

答案 3 :(得分:0)

首先,在作为嵌套列表理解的result_list中,外部列表推导返回sub_list。因此,内部列表理解应该就此进行。

此外,您获得预期字符串或缓冲区错误的确切原因是因为您的blah1xblah2somethinglese1等都不是字符串。假设它们是字符串并修复列表理解,我们有:

result_list = [[tup for tup in sub_list if re.search('.*blah.*',sub_list[0][0])] for sub_list in start_list]

这将导致您提到的空列表。

[[('blah1', 123)], [('xblah2', 123)], [], []]

要解决此问题,请为空列表

过滤上述列表理解
result_list = filter(lambda x: x, [[tup for tup in sub_list if re.search('.*blah.*',sub_list[0][0])] for sub_list in start_list])

注意,lambda x: xlambda x: len(x)>0

相同

答案 4 :(得分:0)

感谢@warunsl为lambda片段删除列表中的空列表。在评论者指出元组不包含字符串后,我最终搞清楚了。我使用str()将元组中的对象转换为字符串并在其上运行正则表达式。我最终得到的是:

result_list = filter(lambda x: x, [[tup for tup in sub_list if re.match('1.3.6.1.2.1.4.24.7.1.7.1.4.172.16.0.100.32', str(tup[0]))] for sub_list in start_list])