docs: def string2geocoord(coord_str, coord_class, format_str = 'D'):
      '''
      Create a GeoCoord object (e.g. Latitude or Longitude) from a string.
      Inputs:
          coord_str (str) - a string representation of a geographic coordinate (e.g. '5.083 N'). Each
            section of the string must be separated by some kind of a separator character ('5.083N' is
            invalid).
          coord_class (class) - a class inheriting from GeoCoord that includes a set_hemisphere method.
            Can be either Latitude or Longitude
          format_str (str) - a string representation of the sections of coord_str. Possible letter values
          correspond to the keys of the dictionary format2value, where
                'H' is a hemisphere identifier (e.g. N, S, E or W)
                'D' is a coordinate in decimal degrees notation
                'd' is a coordinate in degrees notation
                'M' is a coordinate in decimal minutes notaion
                'm' is a coordinate in minutes notation
                'S' is a coordinate in seconds notation
                Any other characters (e.g. ' ' or ', ') will be treated as a separator between the above components.
            All components should be separated by the '%' character. For example, if the coord_str is
            '5, 52, 59.88_N', the format_str would be 'd%, %m%, %S%_%H'
      Returns:
          GeoCoord object initialized with the coordinate information from coord_str
      '''
      new_coord = coord_class()
      # Dictionary of functions for setting variables in the coordinate class:
      format2value = {'H': new_coord.set_hemisphere,
                      'M': new_coord.set_minute,
                      'm': new_coord.set_minute,
                      'd': new_coord.set_degree,
                      'D': new_coord.set_degree,
                      'S': new_coord.set_second}
      if format_str[0] == 'H':
          ''' Having the hemisphere identifier at the beginning is problematic for ensuring that
          the final coordinate value will be negative. Instead, change the identifier and the
          format string so that the hemisphere is identified at the end:'''
          new_coord_start = re.search('\d', coord_str).start() # Find the beginning of the coordinate
          new_format_start = re.search('[a-gi-zA-GI-Z]', format_str).start() # Find the first non-hemisphere identifier
          format_str = '% %'.join((format_str[new_format_start:], format_str[0])) # Move hemisphere identifier to the back
          coord_str = ' '.join((coord_str[new_coord_start:], coord_str[0])) # Move hemisphere identifier to the back
      format_elements = format_str.split('%')
      separators = [sep for sep in format_elements if sep not in format2value.keys()] # E.g. ' ', '_' or ', ' characters
      separators.append('%') # Dummy separator for the final part of the coord_str
      formatters = [form for form in format_elements if form in format2value.keys()] # E.g. 'D', 'm', or 'S' characters
      for form, sep in zip(formatters, separators):
          coord_elements = coord_str.split(sep)
          format2value[form](coord_elements[0]) # Set the coordinate variable (e.g. 'self.degree' with the coordinate substring (e.g. '5')
          coord_str = sep.join(coord_elements[1:]) # Get rid of parts of the substring that have already been done
      new_coord._update() # Change all of the variables in the coordinate class so they are consistent with each other
      return new_coord