docs: def filter_needs(needs, filter_string="", filter_parts=True, merge_part_with_parent=True):
      """
      Filters given needs based on a given filter string.
      Returns all needs, which pass the given filter.
  
      :param merge_part_with_parent: If True, need_parts inherit options from their parent need
      :param filter_parts: If True, need_parts get also filtered
      :param filter_string: strings, which gets evaluated against each need
      :param needs: list of needs, which shall be filtered
      :return:
      """
  
      if filter_string is None or filter_string == "":
          return needs
  
      found_needs = []
  
      for filter_need in needs:
          try:
              if filter_single_need(filter_need, filter_string):
                  found_needs.append(filter_need)
          except Exception as e:
              logger.warning("Filter {0} not valid: Error: {1}".format(filter_string, e))
  
      return found_needs