How to find an index of an item in a list, searching the item with a regular expression in Python?
我有一个这样的列表:
1 | lst = ['something', 'foo1', 'bar1', 'blabla', 'foo2'] |
是否可以使用正则表达式和
1 | ind = lst.index("some_regex_for_the_item_starting_with_foo") ? |
我知道我可以创建一个计数器和一个for循环并使用方法
如果我错过了一些更短更优雅的方式,我很好奇。
我认为没关系,你可以使用startswith方法,如果你做你真正想要的(我不确定你真的需要regEx在这里 - 但是下面的代码可以很容易地修改为使用regEx):
1 2 | data = ['text', 'foo2', 'foo1', 'sample'] indeces = (i for i,val in enumerate(data) if val.startswith('foo')) |
或者使用正则表达式:
1 2 3 | from re import match data = ['text', 'foo2', 'foo1', 'sample'] indeces = (i for i,val in enumerate(data) if match('foo', val)) |
不,遗憾的是
有一个解决方案本来可以
1 2 | # warning: NOT working code result = L.index(True, key=lambda x: regexp.match(x) is not None) |
此外,鉴于我刚刚发现
使用
1 2 3 4 | 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 |
正如发送者在评论中指出的那样,可以通过使用带有默认值的
1 | ind = next((i for i, v in enumerate(lst) if v.startswith("foo")), -1) |
1 2 | l = ['something', 'foo1', 'bar1', 'blabla', 'foo2'] l.index(filter(lambda x:x.startswith('foo'),l)[0]) |
内置这样的东西会很酷。但Python并不是这样。使用itertools有一些有趣的解决方案。 (这些也让我想要
1 2 3 4 5 | >>> from itertools import takewhile >>> import re >>> m = re.compile('foo.*') >>> print len(tuple(itertools.takewhile(lambda x: not m.match(x), lst))) 1 |
这是我的第一个想法,但它要求你创建一个临时元组并占用它的长度。然后我发现你可以做一个简单的总和,并避免临时列表:
1 2 | >>> print sum(1 for _ in takewhile(lambda x: not m.match(x), lst)) 1 |
但这也有些麻烦。我希望尽可能避免丢失变量。让我们再试一次。
1 2 | >>> sum(takewhile(bool, (not m.match(x) for x in lst))) 1 |
好多了。