import re


def extract_tags_links(string):
    """Extract tags and links from a narration string.

    Args:
        string: A string, possibly containing tags (`#tag`) and links
        (`^link`).

    Returns:
        A triple (new_string, tags, links) where `new_string` is `string`
        stripped of tags and links.
    """

    tags = re.findall(r'(?:^|\s)#([A-Za-z0-9\-_/.]+)', string)
    links = re.findall(r'(?:^|\s)\^([A-Za-z0-9\-_/.]+)', string)
    new_string = re.sub(r'(?:^|\s)[#^]([A-Za-z0-9\-_/.]+)', '', string).strip()

    return new_string, frozenset(tags), frozenset(links)