import re


def translate(pattern):
    r"""
    Given a glob pattern, produce a regex that matches it.

    >>> translate('*.txt')
    '[^/]*\\.txt'
    >>> translate('a?txt')
    'a[^/]txt'
    >>> translate('**/*')
    '.*/[^/]*'
    """
    return "".join(map(replace, separate(pattern)))


def separate(pattern):
    """
    Separate out character sets to avoid translating their contents.

    >>> [m.group(0) for m in separate('*.txt')]
    ['*.txt']
    >>> [m.group(0) for m in separate('a[?]txt')]
    ['a', '[?]', 'txt']
    """
    return re.finditer(r"([^\[]+)|(?P<set>[\[].*?[\]])|([\[][^\]]*$)", pattern)


def replace(match):
    """
    Perform the replacements for a match from :func:`separate`.
    """

    return match.group("set") or (
        re.escape(match.group(0)).replace("\\*\\*", r".*").replace("\\*", r"[^/]*").replace("\\?", r"[^/]")
    )
