2009-08-11 5 views
3

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

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

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

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

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

Приветствия, Майк

+2

Ваш код и комментарии не совпадают. :) Вы говорите, что хотите «все, что начинается с foobar» (следовательно, ответ @ THC4k), но ваш код печатает все строки, содержащие «foobar» где угодно (отсюда ответы других). – pilcrow

+0

Согласен - я не был достаточно осторожен, формулируя свой вопрос. Я не буду это исправлять, хотя будущие поколения могут видеть, что я глупый, а не тот, кто ответил. Извините, ребята, спасибо за ответы. – WalkingRandomly

ответ

15

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

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

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

matches = [s for s in mytext if s.startswith('foobar')] 
+0

Теперь мне интересно, лучше ли делать это как генератор: matches = (s для s в mytext, если s.startswith ('foobar')) Кто-нибудь знает? –

+1

@Koen Лучше использовать генератор, если (a) список результатов будет большим (хотя он будет состоять только из ссылок на исходные строки) и (b) вам не нужно иметь результат в одном фрагменте, например. сделать len (совпадения) или совпадения [-1], но скорее захотеть итерации через него. – ThomasH

+0

+1 для упоминания str.startswith(), мне это нужно. –

5
results = [ s for s in lst if 'foobar' in s] 
print(results) 
4

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

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

или

found = [ s for s in mylist if s.startswith('foobar') ] 
9

Если вы действительно хотите первое вхождение строка, которая ЗАПУСКАЕТСЯ с foobar (это то, что говорят ваши слова, хотя и очень отличается от вашего кода, все предоставленные ответы, ваше упоминание о grep - как вы можете это сделать противоречиво?), попробуйте:

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

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

+0

+1 Я просто взломал голову над (s для s in ...) [0] выражение, чтобы получить только первый элемент, и задавался вопросом, что делать, если нет первого элемента ... – ThomasH

+0

@ThomasH, да, в 2.5 вам нужно было выполнить «try:/x = blah.next()/except StopIteration', встроенный« следующий »2.6 намного удобнее! –

Смежные вопросы