docs: def crop(self, crops, predicate=None, index=None):
          """
          crop the match with given Match objects or spans tuples
          :param crops:
          :type crops: list or object
          :return: a list of Match objects
          :rtype: list[Match]
          """
          if not is_iterable(crops) or len(crops) == 2 and isinstance(crops[0], int):
              crops = [crops]
          initial = copy.deepcopy(self)
          ret = [initial]
          for crop in crops:
              if hasattr(crop, 'span'):
                  start, end = crop.span
              else:
                  start, end = crop
              for current in list(ret):
                  if start <= current.start and end >= current.end:
                      # self is included in crop, remove current ...
                      ret.remove(current)
                  elif start >= current.start and end <= current.end:
                      # crop is included in self, split current ...
                      right = copy.deepcopy(current)
                      current.end = start
                      if not current:
                          ret.remove(current)
                      right.start = end
                      if right:
                          ret.append(right)
                  elif current.end >= end > current.start:
                      current.start = end
                  elif current.start <= start < current.end:
                      current.end = start
          return filter_index(ret, predicate, index)