code: def sort_versions(versions=(), reverse=False, sep=u'.'):
      if versions == []:
          return []
      digits = u'0123456789'
      def toint(x):
          try:
              n = int(x)
          except:
              n = x
          return n
      versions = list(versions)
      new_versions, alpha, sizes = [], set(), set()
      for item in versions:
          it = item.split(sep)
          temp = []
          for i in it:
              x = toint(i)
              if not isinstance(x, int):
                  x = u(x)
                  middle = x.lstrip(digits).rstrip(digits)
                  tail = toint(x.lstrip(digits).replace(middle, u''))
                  head = toint(x.rstrip(digits).replace(middle, u''))
                  middle = toint(middle)
                  res = [head, middle, tail]
                  while u'' in res:
                      res.remove(u'')
                  for r in res:
                      if is_unicode(r):
                          alpha.add(r)
              else:
                  res = [x]
              temp += res
          sizes.add(len(temp))
          new_versions.append(temp)
      replace_dic = {}
      alpha = sorted(alpha, reverse=True)
      if len(alpha):
          replace_dic = dict(zip(alpha, list(range(-1, -(len(alpha)+1), -1))))
      nmax = max(sizes)
      for i in range(len(new_versions)):
          item = []
          for z in new_versions[i]:
              if z in replace_dic:
                  item.append(replace_dic[z])
              else:
                  item.append(z)
          nzeros = nmax - len(item)
          item += [0]*nzeros
          item += [versions[i]]
          new_versions[i] = item
      new_versions = sorted(new_versions, reverse=reverse)
      return [n[-1] for n in new_versions]