docs: def digestInSilico(proteinSequence, cleavageRule='[KR]', missedCleavage=0,
                     removeNtermM=True, minLength=5, maxLength=55):
      """Returns a list of peptide sequences and cleavage information derived
      from an in silico digestion of a polypeptide.
  
      :param proteinSequence: amino acid sequence of the poly peptide to be
          digested
      :param cleavageRule: cleavage rule expressed in a regular expression, see
          :attr:`maspy.constants.expasy_rules`
      :param missedCleavage: number of allowed missed cleavage sites
      :param removeNtermM: booo, True to consider also peptides with the
          N-terminal methionine of the protein removed
      :param minLength: int, only yield peptides with length >= minLength
      :param maxLength: int, only yield peptides with length <= maxLength
  
      :returns: a list of resulting peptide enries. Protein positions start with
          ``1`` and end with ``len(proteinSequence``. ::
  
              [(peptide amino acid sequence,
                {'startPos': int, 'endPos': int, 'missedCleavage': int}
                ), ...
               ]
  
      .. note::
          This is a regex example for specifying N-terminal cleavage at lysine
          sites ``\\w(?=[K])``
      """
      passFilter = lambda startPos, endPos: (endPos - startPos >= minLength and
                                             endPos - startPos <= maxLength
                                             )
      _regexCleave = re.finditer(cleavageRule, proteinSequence)
  
      cleavagePosList = set(itertools.chain(map(lambda x: x.end(), _regexCleave)))
      cleavagePosList.add(len(proteinSequence))
      cleavagePosList = sorted(list(cleavagePosList))
      #Add end of protein as cleavage site if protein doesn't end with specififed
      #cleavage positions
      numCleavageSites = len(cleavagePosList)
  
      if missedCleavage >= numCleavageSites:
          missedCleavage = numCleavageSites -1
  
      digestionresults = list()
      #Generate protein n-terminal peptides after methionine removal
      if removeNtermM and proteinSequence[0] == 'M':
          for cleavagePos in range(0, missedCleavage+1):
              startPos = 1
              endPos = cleavagePosList[cleavagePos]
              if passFilter(startPos, endPos):
                  sequence = proteinSequence[startPos:endPos]
                  info = dict()
                  info['startPos'] = startPos+1
                  info['endPos'] = endPos
                  info['missedCleavage'] = cleavagePos
                  digestionresults.append((sequence, info))
  
      #Generate protein n-terminal peptides
      if cleavagePosList[0] != 0:
          for cleavagePos in range(0, missedCleavage+1):
              startPos = 0
              endPos = cleavagePosList[cleavagePos]
              if passFilter(startPos, endPos):
                  sequence = proteinSequence[startPos:endPos]
                  info = dict()
                  info['startPos'] = startPos+1
                  info['endPos'] = endPos
                  info['missedCleavage'] = cleavagePos
                  digestionresults.append((sequence, info))
  
      #Generate all remaining peptides, including the c-terminal peptides
      lastCleavagePos = 0
      while lastCleavagePos < numCleavageSites:
          for missedCleavage in range(0, missedCleavage+1):
              nextCleavagePos = lastCleavagePos + missedCleavage + 1
              if nextCleavagePos < numCleavageSites:
                  startPos = cleavagePosList[lastCleavagePos]
                  endPos = cleavagePosList[nextCleavagePos]
                  if passFilter(startPos, endPos):
                      sequence = proteinSequence[startPos:endPos]
                      info = dict()
                      info['startPos'] = startPos+1
                      info['endPos'] = endPos
                      info['missedCleavage'] = missedCleavage
                      digestionresults.append((sequence, info))
          lastCleavagePos += 1
  
      return digestionresults