docs: def parse_string(self, timestr, subfmts):
          """Read time from a single string, using a set of possible formats."""
          # Datetime components required for conversion to JD by ERFA, along
          # with the default values.
          components = ('year', 'mon', 'mday')
          defaults = (None, 1, 1, 0)
          # Assume that anything following "." on the right side is a
          # floating fraction of a second.
          try:
              idot = timestr.rindex('.')
          except:
              fracday = 0.0
          else:
              timestr, fracday = timestr[:idot], timestr[idot:]
              fracday = float(fracday)
  
          for _, strptime_fmt_or_regex, _ in subfmts:
              vals = []
              #print strptime_fmt_or_regex
              if isinstance(strptime_fmt_or_regex, six.string_types):
                  try:
                      #print timstr
                      #print strptime_fmt_or_regex
                      tm = time.strptime(timestr, strptime_fmt_or_regex)
                      tm.tm_hour += int(24 * fracday)
                      tm.tm_min += int(60 * (24 * fracday - tm.tm_hour))
                      tm.tm_sec += 60 * (60 * (24 * fracday - tm.tm_hour) - tm.tm_min)
                  except ValueError as ex:
                      print ex
                      continue
                  else:
                      vals = [getattr(tm, 'tm_' + component)
                              for component in components]
  
              else:
                  tm = re.match(strptime_fmt_or_regex, timestr)
                  if tm is None:
                      continue
                  tm = tm.groupdict()
                  vals = [int(tm.get(component, default)) for component, default
                          in six.moves.zip(components, defaults)]
  
                  hrprt = int(24 * fracday)
                  vals.append(hrprt)
                  mnprt = int(60 * (24 * fracday - hrprt))
                  vals.append(mnprt)
                  scprt = 60 * (60 * (24 * fracday - hrprt) - mnprt)
                  vals.append(scprt)
              return vals
          else:
              raise ValueError('Time {0} does not match {1} format'
                               .format(timestr, self.name))