docs: def get_format(self, c, i):
          """Get format group."""
  
          index = i.index
          field = ''
          value = []
  
          try:
              if c == '}':
                  value.append((_util.FMT_FIELD, ''))
                  value.append((_util.FMT_INDEX, -1))
              else:
                  # Field
                  if c in _LETTERS_UNDERSCORE:
                      # Handle name
                      value.append(c)
                      c = self.format_next(i)
                      while c in _WORD:
                          value.append(c)
                          c = self.format_next(i)
                  elif c in _DIGIT:
                      # Handle group number
                      value.append(c)
                      c = self.format_next(i)
                      while c in _DIGIT:
                          value.append(c)
                          c = self.format_next(i)
  
                  # Try and covert to integer index
                  field = ''.join(value).strip()
                  try:
                      value = [(_util.FMT_FIELD, str(int(field, 10)))]
                  except ValueError:
                      value = [(_util.FMT_FIELD, field)]
                      pass
  
                  # Attributes and indexes
                  count = 0
                  while c in ('[', '.'):
                      if c == '[':
                          findex = []
                          sindex = i.index - 1
                          c = self.format_next(i)
                          try:
                              while c != ']':
                                  findex.append(c)
                                  c = self.format_next(i)
                          except StopIteration:
                              raise SyntaxError("Unmatched '[' at %d" % (sindex - 1))
                          idx = self.parse_format_index(''.join(findex))
                          if isinstance(idx, int):
                              value.append((_util.FMT_INDEX, idx))
                          else:
                              value.append((_util.FMT_INDEX, idx))
                          c = self.format_next(i)
                      else:
                          if count == 0:
                              value.append((_util.FMT_INDEX, -1))
                          findex = []
                          c = self.format_next(i)
                          while c in _WORD:
                              findex.append(c)
                              c = self.format_next(i)
                          value.append((_util.FMT_ATTR, ''.join(findex)))
                      count += 1
  
                  if count == 0:
                      value.append((_util.FMT_INDEX, -1))
  
                  # Conversion
                  if c == '!':
                      c = self.format_next(i)
                      if c not in _FMT_CONV_TYPE:
                          raise SyntaxError("Invalid conversion type at %d!" % (i.index - 1))
                      value.append((_util.FMT_CONV, c))
                      c = self.format_next(i)
  
                  # Format spec
                  if c == ':':
                      fill = None
                      width = []
                      align = None
                      convert = None
                      c = self.format_next(i)
  
                      if c in ('<', '>', '^'):
                          # Get fill and alignment
                          align = c
                          c = self.format_next(i)
                          if c in ('<', '>', '^'):
                              fill = align
                              align = c
                              c = self.format_next(i)
                      elif c in _DIGIT:
                          # Get Width
                          fill = c
                          c = self.format_next(i)
                          if c in ('<', '>', '^'):
                              align = c
                              c = self.format_next(i)
                          else:
                              width.append(fill)
                              fill = None
                      else:
                          fill = c
                          c = self.format_next(i)
                          if fill == 's' and c == '}':
                              convert = fill
                              fill = None
                          if fill is not None:
                              if c not in ('<', '>', '^'):
                                  raise SyntaxError('Invalid format spec char at %d!' % (i.index - 1))
                              align = c
                              c = self.format_next(i)
  
                      while c in _DIGIT:
                          width.append(c)
                          c = self.format_next(i)
  
                      if not align and len(width) and width[0] == '0':
                          raise ValueError("'=' alignment is not supported!")
                      if align and not fill and len(width) and width[0] == '0':
                          fill = '0'
  
                      if c == 's':
                          convert = c
                          c = self.format_next(i)
  
                      if fill and self.is_bytes:
                          fill = fill.encode('latin-1')
                      elif not fill:
                          fill = b' ' if self.is_bytes else ' '
  
                      value.append((_util.FMT_SPEC, (fill, align, (int(''.join(width)) if width else 0), convert)))
  
              if c != '}':
                  raise SyntaxError("Unmatched '{' at %d" % (index - 1))
          except StopIteration:
              raise SyntaxError("Unmatched '{' at %d!" % (index - 1))
  
          return field, value