如何在列表中查找项目的索引,在Python中使用正则表达式搜索项目?

时间:2011-07-07 20:12:09

标签: python regex list indexing

我有一个这样的清单:

lst = ['something', 'foo1', 'bar1', 'blabla', 'foo2']

是否可以使用正则表达式和lst.index()来获取以“foo”(foo1)开头的第一个项目的索引:

ind = lst.index("some_regex_for_the_item_starting_with_foo") ?

我知道我可以创建一个计数器和一个for循环并使用方法startswith()。 如果我错过了一些更短更优雅的方式,我很好奇。

5 个答案:

答案 0 :(得分:3)

我认为没关系,你可以使用startswith方法,如果你做你真正想要的(我不确定你真的需要regEx在这里 - 但是下面的代码可以很容易地修改为使用regEx):

data = ['text', 'foo2', 'foo1', 'sample']
indeces = (i for i,val in enumerate(data) if val.startswith('foo'))

或者使用正则表达式:

from re import match
data = ['text', 'foo2', 'foo1', 'sample']
indeces = (i for i,val in enumerate(data) if match('foo', val))

答案 1 :(得分:1)

使用lst.index无法做到这一点,但是这里有一种替代方法,你可能会发现它比for循环更优雅:

try:
    ind = (i for i, v in enumerate(lst) if v.startswith("foo")).next()
except StopIteration:
    ind = -1   # or however you want to say that the item wasn't found

正如发送者在评论中指出的那样,可以通过使用next()内置函数(2.6+)和默认值将其缩短为一行来缩短这一点:

ind = next((i for i, v in enumerate(lst) if v.startswith("foo")), -1)

答案 2 :(得分:1)

不,遗憾的是key没有list.index参数。 有一个解决方案可能是

# warning: NOT working code
result = L.index(True, key=lambda x: regexp.match(x) is not None)

此外,鉴于我刚刚发现lambda显然在python社区中被认为是令人憎恶的,我不确定将来是否会添加更多key个参数。

答案 3 :(得分:0)

内置这样的东西会很酷。但Python并不是这样。使用itertools有一些有趣的解决方案。 (这些也使我希望itertools.takewhile_false。如果它存在,这些将更具可读性。)

>>> from itertools import takewhile
>>> import re
>>> m = re.compile('foo.*')
>>> print len(tuple(itertools.takewhile(lambda x: not m.match(x), lst)))
1

这是我的第一个想法,但它要求你创建一个临时元组并占用它的长度。然后我发现你可以做一个简单的总和,并避免临时列表:

>>> print sum(1 for _ in takewhile(lambda x: not m.match(x), lst))
1

但这也有些麻烦。我希望尽可能避免丢失变量。让我们再试一次。

>>> sum(takewhile(bool, (not m.match(x) for x in lst)))
1

好多了。

答案 4 :(得分:0)

l = ['something', 'foo1', 'bar1', 'blabla', 'foo2']
l.index(filter(lambda x:x.startswith('foo'),l)[0])