(items, whitelist=None, blacklist=None, key=None)
This filters `items` by a regular expression `whitelist` and/or
    `blacklist`, with the `blacklist` taking precedence. An optional `key`
    function can be provided that will be passed each item.
This filters `items` by a regular expression `whitelist` and/or
    `blacklist`, with the `blacklist` taking precedence. An optional `key`
    function can be provided that will be passed each item.
This filters items by a regular expression whitelist and / or blacklist with the blacklist taking precedence . An optional key function can be provided that will be passed each item .
def pattern_filter(items, whitelist=None, blacklist=None, key=None):
    """This filters `items` by a regular expression `whitelist` and/or
    `blacklist`, with the `blacklist` taking precedence. An optional `key`
    function can be provided that will be passed each item.
    """
    key = key or __return_self
    if whitelist:
        whitelisted = _filter(items, whitelist, key)

        if blacklist:
            blacklisted = _filter(items, blacklist, key)
            # Remove any blacklisted items from the whitelisted ones.
            whitelisted.difference_update(blacklisted)

        return [item for item in items if key(item) in whitelisted]

    elif blacklist:
        blacklisted = _filter(items, blacklist, key)
        return [item for item in items if key(item) not in blacklisted]

    else:
        return items
def pattern_filter ( items , whitelist = None , blacklist = None , key = None ) : key = key or __return_self if whitelist : whitelisted = _filter ( items , whitelist , key ) if blacklist : blacklisted = _filter ( items , blacklist , key ) # Remove any blacklisted items from the whitelisted ones. whitelisted . difference_update ( blacklisted ) return [ item for item in items if key ( item ) in whitelisted ] elif blacklist : blacklisted = _filter ( items , blacklist , key ) return [ item for item in items if key ( item ) not in blacklisted ] else : return items