Splitting a string basing myself on categories
Relying on special values (namely '·') not to be present in the input is a bad idea.  Your problem is basically a variant of itertools.groupby(), so you should use that.

from itertools import groupby

def split_on_changes(string, cats):
    """
    docstring and doctest here

    """
    def category(char):
        """
        Return the index of the category to which char belongs
        (or None if it does not belong to any category).
        """
        return next((i for (i, cat) in enumerate(cats) if char in cat), None)
    return list(''.join(group) for _, group in groupby(string, category))


The category() helper function is based on this technique to find the first element of a list that satisfies a predicate.  It could also be written as

def category(char):
    for i, cat in enumerate(cats):
        if char in cat:
            return i


Depending on what you want to do with the results, you might want to consider not calling list() and string.join().