<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def find_matching_controllers(*requirements, **kwargs) -> [ControllerDiscovery]: """ Find a sequence of controllers which match the supplied requirements, or raise an error if no such controllers exist. :param requirements: Zero or more ControllerRequirement instances defining the requirements for controllers. If no item is passed it will be treated as a single requirement with no filters applied and will therefore match the first controller found. :return: A sequence of the same length as the supplied requirements array containing ControllerDiscovery instances which match the requirements supplied. :raises: ControllerNotFoundError if no appropriately matching controllers can be located """

    requirements = list(requirements)
    if requirements is None or len(requirements) == 0:
        requirements = [ControllerRequirement()]

    def pop_controller(r: ControllerRequirement, discoveries: [ControllerDiscovery]) -> ControllerDiscovery:
        """
        Find a single controller matching the supplied requirement from a list of ControllerDiscovery instances

        :param r:
            The ControllerRequirement to match
        :param discoveries:
            The [ControllerDiscovery] to search
        :return:
            A matching ControllerDiscovery. Modifies the supplied list of discoveries, removing the found item.
        :raises:
            ControllerNotFoundError if no matching controller can be found
        """
        for index, d in enumerate(discoveries):
            if r.accept(d):
                return discoveries.pop(index)
        raise ControllerNotFoundError()

    all_controllers = find_all_controllers(**kwargs)

    try:
        return list(pop_controller(r, all_controllers) for r in requirements)
    except ControllerNotFoundError as exception:
        logger.info('Unable to satisfy controller requirements' +
                    ', required {}, found {}'.format(requirements, find_all_controllers(**kwargs)))
        raise exception