def matches_from_list(item,options,fuzzy=90,fname_match=True,fuzzy_fragment=None,guess=False):
    '''Returns the members of ``options`` that best matches ``item``. Will prioritize
    exact matches, then filename-style matching, then fuzzy matching. Returns a tuple of item,
    index, match type, and fuzziness (if applicable)
    
         :item:             string to match
         :options:          list of examples to test against
         :fuzzy:            integer (out of 100) describing how close to match string
         :fname_match:      use filename globbing to match files?
         :fuzzy_fragment:   if not ``None``, will accept substring matches of
                            at least ``fuzzy_fragment`` fuzziness
         :guess:            if ``True``, shortcut for setting ``fuzzy`` and ``min_fragment``
                            to very lenient options
    '''
    matches = []
    
    if guess:
        fuzzy = min(fuzzy,80)
        fuzzy_fragment = min(fuzzy_fragment,70)
    
    option_not_in = lambda item,match_list: all([x[0]!=item for x in match_list])
    
    # Exact matches
    if item in options:
        matches += [(options[i],i,'exact',None) for i in xrange(len(options)) if options[i].lower()==item.lower()]
        # If we have exact matches, don't bother with fuzzy matching
        return matches
    
    # Filename-style matches
    if fname_match:
        matches += [(x,options.index(x),'fname',None) for x in fnmatch.filter(options,item) if option_not_in(x,matches)]
    
    # Fuzzy matches
    if fuzzy:
        sub_matches = []
        for i in xrange(len(options)):
            r = fuzz.ratio(item.lower(),options[i].lower())
            if r>=fuzzy and option_not_in(options[i],matches):
                sub_matches.append((r,i))
        matches += [(options[x[1]],x[1],'fuzzy',x[0]) for x in sorted(sub_matches)]
    
    # Fragment matches
    if fuzzy_fragment:
        sub_matches = []
        for i in xrange(len(options)):
            r = fuzz.partial_ratio(item.lower(),options[i].lower())
            if r>=fuzzy_fragment and option_not_in(options[i],matches):
                sub_matches.append((r,i))
        matches += [(options[x[1]],x[1],'fuzzy_fragment',x[0]) for x in sorted(sub_matches)]
    
    return matches
def matches_from_list ( item , options , fuzzy = 90 , fname_match = True , fuzzy_fragment = None , guess = False ) : matches = [ ] if guess : fuzzy = min ( fuzzy , 80 ) fuzzy_fragment = min ( fuzzy_fragment , 70 ) option_not_in = lambda item , match_list : all ( [ x [ 0 ] != item for x in match_list ] ) if item in options : matches += [ ( options [ i ] , i , 'exact' , None ) for i in xrange ( len ( options ) ) if options [ i ] . lower ( ) == item . lower ( ) ] return matches if fname_match : matches += [ ( x , options . index ( x ) , 'fname' , None ) for x in fnmatch . filter ( options , item ) if option_not_in ( x , matches ) ] if fuzzy : sub_matches = [ ] for i in xrange ( len ( options ) ) : r = fuzz . ratio ( item . lower ( ) , options [ i ] . lower ( ) ) if r >= fuzzy and option_not_in ( options [ i ] , matches ) : sub_matches . append ( ( r , i ) ) matches += [ ( options [ x [ 1 ] ] , x [ 1 ] , 'fuzzy' , x [ 0 ] ) for x in sorted ( sub_matches ) ] if fuzzy_fragment : sub_matches = [ ] for i in xrange ( len ( options ) ) : r = fuzz . partial_ratio ( item . lower ( ) , options [ i ] . lower ( ) ) if r >= fuzzy_fragment and option_not_in ( options [ i ] , matches ) : sub_matches . append ( ( r , i ) ) matches += [ ( options [ x [ 1 ] ] , x [ 1 ] , 'fuzzy_fragment' , x [ 0 ] ) for x in sorted ( sub_matches ) ] return matches
Returns the members of ``options`` that best matches ``item``. Will prioritize
    exact matches, then filename-style matching, then fuzzy matching. Returns a tuple of item,
    index, match type, and fuzziness (if applicable)
    
         :item:             string to match
         :options:          list of examples to test against
         :fuzzy:            integer (out of 100) describing how close to match string
         :fname_match:      use filename globbing to match files?
         :fuzzy_fragment:   if not ``None``, will accept substring matches of
                            at least ``fuzzy_fragment`` fuzziness
         :guess:            if ``True``, shortcut for setting ``fuzzy`` and ``min_fragment``
                            to very lenient options