Питонический способ поиска подстроки в списке - PullRequest
3 голосов
/ 11 августа 2009

У меня есть список строк - что-то вроде

mytext = ['This is some text','this is yet more text','This is text that contains the substring foobar123','yet more text']

Я хочу найти первое вхождение всего, что начинается с foobar. Если бы я был опорочен, я бы занялся поиском foobar *. Мое текущее решение выглядит так

for i in mytext:
    index = i.find("foobar")
    if(index!=-1):
        print i

Что работает просто отлично, но мне интересно, есть ли «лучший» (то есть более питонический) способ сделать это?

Ура, Mike

Ответы [ 5 ]

15 голосов
/ 11 августа 2009

Вы также можете использовать понимание списка:

matches = [s for s in mytext if 'foobar' in s]

(и если вы действительно искали строки начиная с с 'foobar', как заметил THC4k, учтите следующее:

matches = [s for s in mytext if s.startswith('foobar')]
9 голосов
/ 11 августа 2009

Если вы действительно хотите ПЕРВОЕ вхождение строки, начинающейся с foobar (то, что ваши слова говорят, хотя и сильно отличается от вашего кода, все ответы предоставлены, ваше упоминание о grep - насколько противоречивым вы можете быть? -) попробуйте:

found = next((s for s in mylist if s.startswith('foobar')), '')

это дает пустую строку как результат found, если ни один элемент mylist не удовлетворяет условию. Вы также можете использовать itertools и т. Д. Вместо простого genexp, но ключевой трюк заключается в том, чтобы использовать встроенный next со значением по умолчанию (только Python 2.6 и выше).

6 голосов
/ 11 августа 2009
for s in lst:
    if 'foobar' in s:
         print(s)
5 голосов
/ 11 августа 2009
results = [ s for s in lst if 'foobar' in s]
print(results)
4 голосов
/ 11 августа 2009

, если вы действительно ищете строки, которые начинаются с foobar (не с foobar в их):

for s in mylist:
  if s.startswith( 'foobar' ):
     print s

или

found = [ s for s in mylist if s.startswith('foobar') ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...