12
votes

Python Re "Erreur de badge d'évacuation"

Je joue avec les modules de Python Re (Strong> .Search . CUR est l'entrée d'un widget d'entrée Tkinter. Chaque fois que je saisis un "\" dans le widget d'entrée, il jette cette erreur. Je ne suis pas tout à fait sûr de l'erreur ou de la façon de traiter. Toute opinion serait très appréciée.

CUR est une chaîne

tup [0] est également une chaîne

snippet: < Pré> xxx

l'erreur: xxx


0 commentaires

4 Réponses :


3
votes

Le premier paramètre à re est le motif à rechercher, donc si "CUR" contient une barre oblique inverse à la fin de la ligne, ce sera une séquence d'échappement non valide. Vous avez probablement échangé vos arguments autour (je ne sais pas ce que TUP [0] est, mais est-ce votre modèle?) Et cela devrait être comme celui-ci xxx

comme vous utilisez très rarement Entrée de l'utilisateur en tant que motif (sauf si vous faites un mécanisme de recherche d'expression régulière, auquel cas vous voudrez peut-être afficher l'erreur à la place).

hth.

Modifier :
L'erreur de signaler est que vous utilisez un caractère d'échappement avant la fin de la ligne (ce que faux évasion (fin de ligne) signifie), c'est-à-dire que votre motif se termine par une barre oblique inverse. n'est pas un modèle valide. Caractère d'échappement (backslash) doit être suivi d'un autre caractère, qui supprime ou ajoute une signification particulière à ce personnage (pas sûr de la manière dont Python le fait, Posix fait des groupes en ajoutant de l'évasion aux parenthèses, Perl supprime l'effet de groupe en l'évacuant). C'est \ * correspond à une astérite littérale, tandis que * correspond au caractère précédent 0 fois ou plus.


4 commentaires

J'utilise l'utilisateur de l'utilisateur pour rechercher le contenu de TUP [0]. Cur est mon motif.


@Fourmilier; Eh bien, si Cur est le motif, c'est-à-dire que l'utilisateur entre dans le motif, il est évidemment incorrect et l'utilisateur doit être informé de cela.


Cela dépend de la question de savoir si l'utilisateur pense qu'elles entrent dans une expression régulière. S'ils pensent qu'ils entrent dans une chaîne fixe, le code doit être corrigé. S'ils pensent qu'ils entrent dans une expression régulière, ils devraient être informés que l'expression est invalide (mais j'espère dans l'esprit d'informer ou d'enseigner plutôt que de châtie).


@Bryan; bon point. Ensuite, bien sûr, vous ne devez pas utiliser d'expressions régulières pour rechercher la chaîne, mais plutôt quelque chose d'équivalent de C strtstr , qui devrait être plus rapide et non sujette à ces problèmes. @Anater a dit " CUR est [SON] modèle", alors j'ai supposé qu'il aimerait avoir l'utilisateur entrer une expression régulière.



3
votes

Si vous essayez de rechercher "Cur" dans "TUP [0]" "Vous devez le faire via" Essayer: ... sauf: ... "Bloc pour attraper un motif non valide:

try :
    se = re.search(cur, tup[0], flags=re.IGNORECASE)
except re.error, e:
    # print to stdout or any status widget in your gui
    print "Your search pattern is not valid."
    # Some details for error:
    print e
    # Or some other code for default action.


0 commentaires

17
votes

"Bogus Escape (fin de ligne)" signifie que votre motif se termine par une barre oblique inverse. Cela n'a rien à voir avec Tkinter. Vous pouvez dupliquer l'erreur assez facilement dans un shell interactif: xxx

la solution? Assurez-vous que votre modèle ne se termine pas avec une seule barre oblique inverse.


7 commentaires

Est-il possible de traiter un \ comme un caractère ordinaire? Semblable à la méthode R "String".


@ Anteater7171: Backslash est spécial pour les expressions régulières. Vous avez deux choix: N'EST PAS DES EXPRESSIONS RECLIQUÉES OUIMISSIQUES DE MODIFIER LA CHINNEE afin que la signification spéciale soit supprimée. Pour ce dernier, l'ajout d'une barre oblique inverse supplémentaire fait l'affaire (c'est-à-dire: le modèle '\\' signifie une barre oblique inverse).


+1 Vous auriez dû ajouter votre dernier commentaire à la réponse. Développer sur le commentaire, dans le contexte de par exemple. Re.Search signifierait de faire des modèle = "foobar \\\\" , c'est-à-dire que vous avez besoin de 4 backslashes afin que l'argument de modèle pour re.Search finit par avoir deux, ce qui ferait une réégyvabilité légale.


C'est en fait un peu malheureux. Cela signifie que pour la rédaction de code d'enregistrement, vous devez vérifier votre variable à l'avance à chaque fois. Et en particulier, vous devez être conscient de cette affaire. Pensez-vous que le modèle se terminant sur le backslash est le seul cas où re.Find ne renvoie pas aucun objet ou un objet de match?


Je préférerais si cela imprimait un avertissement et d'ignorer la barre oblique inverse ou renvoyé aucun


@Radiocontrolled: Non, re.Find lancera des erreurs pour tout type d'expression invalide et il existe de nombreuses façons d'écrire des expressions non valides.


@Bryanoakley, oui, je suppose que si on veut juste trouver une chaîne dans une chaîne, il faut utiliser la méthode Native Python (Code> Python () ou Y a-t-il un équivalent pour re < / code>, tel que la sortie est soit Aucun ou un objet de correspondance au lieu de l'index ou -1 retourné par .Find () ?



12
votes

La solution à ce problème consiste à utiliser une chaîne brute comme texte de remplacement. Ce qui suit ne fonctionnera pas:

def raw_string(s):
    if isinstance(s, str):
        s = s.encode('string-escape')
    elif isinstance(s, unicode):
        s = s.encode('unicode-escape')
    return s


0 commentaires