11
votes

Problème avec regex python et sqlite

J'essaie de vérifier une chaîne avec un motif à l'aide d'une regex avec Python sur une base de données SQLITE. J'ai un problème quand j'essaie de la recherche de la chaîne de recherche "avec un paternel utilisant" Pour l'exemple: xxx

je devrais \ "avant Regexp Autre moyen compilateur, n'aimez pas ... Erreur de syntaxe xxx

Quelqu'un sait faire comment faire Ce?

My Regexp Fonction: Con.Create_function ("Regexp", 2, REGEXP)


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser des échappes triple ou une chaîne brute.

Votre faire: xxx

Utilisez une chaîne brute, qui est un r'string avec AR devant ': xxx

ou triple évasions ( \\\ ): xxx


0 commentaires

32
votes

Utilisez SQL paramétrée. Ensuite, vous n'avez pas besoin d'échapper aux citations vous-même: xxx rendements xxx


1 commentaires

Très bonne réponse! Aussi besoin de se protéger contre l'élément étant Aucun dans REGEXP (), E.G., la première ligne pourrait être "si l'article n'est pas: renvoyer false"



0
votes

Un autre exemple de requête paramétrée ...

Pour la situation où vous devez fournir votre propre fonction de regex à la base de données - je suppose que python sqlite3 ne l'a pas toujours configuré par défaut. P>

Dans un autre exemple, la fonction de regex personnalisée compila la même expression pour chaque match. Il y a un moyen de contourner ça. L'exemple ci-dessous a également un commentaire au bas d'une autre façon de définir l'opération REGEX. P>

Vous pouvez vous contenter de compiler l'expression à chaque fois que l'expression est utilisée (pour chaque match) pour les requêtes traitantes. des données en créant une fonction personnalisée pour chaque requête et compilez l'expression uniquement une fois em>. Ci-dessous Self.Connonn est la connexion à la base de données et les CURS est un curseur de celui-ci. P>

    # Form an expression to match nicknames with the last 3 characters
    # varying.
    nick_expr = re.sub(r"[0-9_\-|]{0,3}$", r"[0-9_\-|]{0,3}$", nick)
    nick_expr = re.compile(nick_expr, re.I)

    # Create custom sqlite3 function using the compiled expression.
    self._conn.create_function("NICKEXPR",
                               1,
                               lambda nick: nick_expr.match(nick) != None)

    # Create temporary table from first pass query.
    curs.execute(
        """ CREATE TEMP TABLE temp_table1 AS
           SELECT  DISTINCT *
           FROM    users
           WHERE   NICKEXPR(nick)
               OR  host LIKE ?
               OR  (account<>'' AND account LIKE ?)
               OR  (address<>'' AND address=?)
       """, (host, account, address))

    # Set up the REGEXP operator/function for the sqlite3 database.
    #self._conn.create_function(
    #                       'REGEXP', 2, 
    #                       lambda exp, item : re.find(exp, item) != None)


1 commentaires

CAVEZER - Si plusieurs threads effectuent la même requête, redéfinir Nickexpr peut affecter la requête de l'autre thread.