code: def parse(
          self,
          time,  # type: str
          fmt,  # type: str
          now,  # type: pendulum.DateTime
          locale=None,  # type:  typing.Union[str, None]
      ):  # type: (...) -> dict
          
          escaped_fmt = re.escape(fmt)
  
          tokens = self._FROM_FORMAT_RE.findall(escaped_fmt)
          if not tokens:
              return time
  
          if not locale:
              locale = pendulum.get_locale()
  
          locale = Locale.load(locale)
  
          parsed = {
              "year": None,
              "month": None,
              "day": None,
              "hour": None,
              "minute": None,
              "second": None,
              "microsecond": None,
              "tz": None,
              "quarter": None,
              "day_of_week": None,
              "day_of_year": None,
              "meridiem": None,
              "timestamp": None,
          }
  
          pattern = self._FROM_FORMAT_RE.sub(
              lambda m: self._replace_tokens(m.group(0), locale), escaped_fmt
          )
  
          if not re.match(pattern, time):
              raise ValueError("String does not match format {}".format(fmt))
  
          re.sub(pattern, lambda m: self._get_parsed_values(m, parsed, locale, now), time)
  
          return self._check_parsed(parsed, now)
docs: Parses a time string matching a given format as a tuple.
  
          :param time: The timestring
          :param fmt: The format
          :param now: The datetime to use as "now"
          :param locale: The locale to use
  
          :return: The parsed elements