0
votes

Python Regex: avoir du mal à comprendre les résultats

J'ai un Dataframe que j'ai besoin d'écrire sur le disque, mais Pyspark n'autorise aucun de ces caractères ,; {} () \\ n \\ t = à présenter dans les en-têtes en écrivant comme fichier de parquet.

Alors j'ai écrit un script simple pour détecter si cela se passe xxx

mais pour chaque en-tête, Aucun a été imprimé. C'est faux parce que je sais que mon fichier a des espaces dans ses en-têtes. Donc, j'ai décidé de vérifier en exécutant les couple de lignes suivantes xxx

Cela a entraîné une erreur Aucun être imprimé.

Je ne suis pas sûr de ce que je fais mal ici.

PS: J'utilise Python3.7


4 commentaires

Vous avez probablement besoin d'une classe de caractères [; {} () \\ n \\\\t =] .


Votre regex correspond à ces personnages tous ensemble. Avez-vous essayé le jeton [ et ] ([; {} \ (\) \\ n \\ t =]) ?


Pour les deux commentaires ci-dessus, nous NE PAS avez besoin de doubler des choses d'échappement comme \ n dans une classe de caractères, une seule barre oblique inverse est suffisante. Et () {} ne nécessite aucune échappée du tout.


Imprimer ((A.Groups ())) Vous pouvez voir les mots qui correspondent à votre modèle


3 Réponses :


2
votes

Le problème est que {} ainsi que () sont des métacaraceurs de regex et ont une signification particulière. Peut-être que le moyen le plus simple d'écrire votre logique serait d'utiliser le motif: xxx

Ceci dit pour correspondre aux caractères littéraux que pyspark ne permet pas d'être présent dans le Les en-têtes. xxx

Si vous vouliez supprimer ces caractères, vous pouvez essayer d'utiliser re. / code>: xxx


0 commentaires

1
votes

Si vous souhaitez vérifier si un texte contient tout fort> de "interdit" Caractères, vous devez les mettre entre [ code> et ] code>.

Un autre défaut dans votre regex est que dans les chaînes "normales" (pas r-strings ) Toute barre oblique inverse doit être doublée forte>. p>

alors changez votre regex à: p> xxx pré>

ou utilisez r-string : P>

r"[,;{}()\n\t= ]"


1 commentaires

Droit. Merci. J'ai édité la question à inclure l'espace



1
votes

Comme déjà expliqué, vous pouvez utiliser REGEX pour rechercher des caractères interdits, je souhaite ajouter que vous pouvez le faire sans utiliser RegEx de suivre:

forbidden = ",;{}()\n\t="
def has_forbidden(txt):
    for i in forbidden:
        if i in txt:
            return True
    return False
print(has_forbidden("ok name")) # False
print(has_forbidden("wrong=name")) # True
print(has_forbidden("with\nnewline")) # True


0 commentaires