Pythonic搜索列表中的子字符串的方法

时间:2009-08-11 15:03:59

标签: string list python substring

我有一个字符串列表 - 类似于

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

哪种方法运行得很好,但我想知道是否有更好的方法(即更多的pythonic)这样做?

干杯, 麦克

5 个答案:

答案 0 :(得分:15)

您还可以使用列表理解:

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

(如果您真的在寻找字符串以'foobar'开始,请注意以下几点:

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

答案 1 :(得分:9)

如果你真的想要第一次出现一个字符串,那就是用foobar开头的(这就是你的话所说的,虽然与你的代码非常不同,提供的所有答案,你提到的grep - 你会得到多么矛盾? - ) ,试试:

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

如果没有mylist项符合条件,则会给出一个空字符串作为found结果。您也可以使用itertools等代替简单的genexp,但关键的技巧是使用next内置函数的默认方式(Python 2.6及更好)。

答案 2 :(得分:6)

for s in lst:
    if 'foobar' in s:
         print(s)

答案 3 :(得分:5)

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

答案 4 :(得分:4)

如果你真的在寻找与foobar 开始的字符串(而不是>中的foobar ):

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

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