code: def _replace_numeric_markers(operation, string_parameters):
      
      def replace_markers(marker, op, parameters):
          param_count = len(parameters)
          marker_index = 0
          start_offset = 0
          while True:
              found_offset = op.find(marker, start_offset)
              if not found_offset > -1:
                  break
              if marker_index < param_count:
                  op = op[:found_offset]+op[found_offset:].replace(marker, parameters[marker_index], 1)
                  start_offset = found_offset + len(parameters[marker_index])
                  marker_index += 1
              else:
                  raise ProgrammingError("Incorrect number of bindings "
                                         "supplied. The current statement uses "
                                         "%d or more, and there are %d "
                                         "supplied." % (marker_index + 1,
                                                        param_count))
          if marker_index != 0 and marker_index != param_count:
              raise ProgrammingError("Incorrect number of bindings "
                                     "supplied. The current statement uses "
                                     "%d or more, and there are %d supplied." %
                                     (marker_index + 1, param_count))
          return op
  
      # replace qmark parameters and format parameters
      operation = replace_markers('?', operation, string_parameters)
      operation = replace_markers(r'%s', operation, string_parameters)
  
      # replace numbered parameters
      # Go through them backwards so smaller numbers don't replace
      # parts of larger ones
      for index in range(len(string_parameters), 0, -1):
          operation = operation.replace(':' + str(index),
                                        string_parameters[index - 1])
      return operation
docs: Replaces qname, format, and numeric markers in the given operation, from
      the string_parameters list.
  
      Raises ProgrammingError on wrong number of parameters or bindings
      when using qmark. There is no error checking on numeric parameters.