import re


def valid_sexp_predicate(sexp):
    """
    文字列中の"のエスケープ判定もしている。文字列リテラルを除外しsexp中に出現する()が全て関数コールとなるようにしてから、(と)の対応関係をチェックする。
    Args:
        sexp (str): euslispに送りつけるS式
    Returns:
        bool: S式が正しいかどうか
    
    >>> valid_sexp_predicate("(+ 1 2)")
    True

    >>> valid_sexp_predicate('(princ "hoge")')
    True

    >>> valid_sexp_predicate('(TEST::consult-hash-with-key (let ((hsh (make-hash-table))) (progn (setf (gethash "moo" hsh) 100) (setf (gethash "bow" hsh) 200)) hsh) "moo")')
    True

    >>> valid_sexp_predicate("(+ 1 2 3))")    # excess ')'
    False

    >>> valid_sexp_predicate("(list 1 2 (3)")    # insufficient ')
    False
  
    >>> sexp = r'(concatenate string "really\\" weird(" "string\\"!")'    # valid s-expression (エスケープ処理ができてないと'(concatenate string weird( string))'なる文字列が残されinvalidと判定されてしまう)
    >>> valid_sexp_predicate(sexp)
    True
    """
    sub = re.sub(r'(?<!\\)\".*?(?<!\\)\"', '', sexp)    # 否定的先読み(?<!)で「 \ が前に存在しない " 」のペアを最短マッチングで(.*?)発見して削除する
    counter = 0
    for char in sub:
        if char == '(':
            counter += 1
        elif char == ')':
            if counter > 0:
                counter -= 1 
            else:
                return False
    if counter > 0:
        return False
    return True