code: 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
docs: 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.