code: def fuzzy_search_by_title(self, title, ignore_groups=None):
          
          entries = []
          # Exact matches trump
          for entry in self.entries:
              if entry.title == title:
                  entries.append(entry)
          if entries:
              return self._filter_entries(entries, ignore_groups)
          # Case insensitive matches next.
          title_lower = title.lower()
          for entry in self.entries:
              if entry.title.lower() == title.lower():
                  entries.append(entry)
          if entries:
              return self._filter_entries(entries, ignore_groups)
          # Subsequence/prefix matches next.
          for entry in self.entries:
              if self._is_subsequence(title_lower, entry.title.lower()):
                  entries.append(entry)
          if entries:
              return self._filter_entries(entries, ignore_groups)
          # Finally close matches that might have mispellings.
          entry_map = {entry.title.lower(): entry for entry in self.entries}
          matches = difflib.get_close_matches(
              title.lower(), entry_map.keys(), cutoff=0.7)
          if matches:
              return self._filter_entries(
                  [entry_map[name] for name in matches], ignore_groups)
          return []
docs: Find an entry by by fuzzy match.
  
          This will check things such as:
  
              * case insensitive matching
              * typo checks
              * prefix matches
  
          If the ``ignore_groups`` argument is provided, then any matching
          entries in the ``ignore_groups`` list will not be returned.  This
          argument can be used to filter out groups you are not interested in.
  
          Returns a list of matches (an empty list is returned if no matches are
          found).