Pages : 1
#1 Le 14/05/2007, à 22:50
- Fenrir
Expressions régulière/filtrage
Bonsoir,
J'ai un petit (qui pourrait devenir gros) problème avec un système de messagerie monté par un prédécesseur.
Je me retrouve avec une liste de compte, comportant des caractères non désirés dans un compte (qui sont différents de a-Z, 0-9, ., - et _).
Ma question est donc, comment extraire une liste des comptes invalides.
Je me suis essayé aux expressions régulières, mais je ne sais pas comment dire : "tout ce qui ne comporte pas QUE les caractères suivants..." (ce n'est peut-être pas une bonne approche).
Voici un exemple pour être plus clair :
toto //valide
to to //invalide
to,to //invalide
t0to //valide
to+o //invalide
t▓to //invalide
t.ot-0 //valide
d'une liste comme celle-ci, je souhaite faire 2 listes, une bonne et une mauvaise (pour ceux qui penseraient à un filtrage manuel, il y a près de 10000 entrées dans cette liste, et pour ceux qui me diront qu'il faut faire de la gestion d'erreur au moment de la saisie, je le sais, mais je reprends le travail d'un autre)
Merci par avance à ceux qui liront ce post et BIG UP à ceux qui me donneront une solution
Hors ligne
#2 Le 14/05/2007, à 23:06
- Spalax
Re : Expressions régulière/filtrage
Sous quel langage ou logiciel fais-tu ce travail ?
Sinon, pour ton problème, il me semble plus simple de chercher à définir une chaîne valide, une chaîne étant invalide si elle ne vérifie pas ce test.
Un chaîne valide est de la forme :
(a+b+...+z+A+B+...+Z+0+1+...+9+.+-+_)+
(les + dans la parenthèse signifient ou et celui à la fin signifie : répété au moins une fois).
Hors ligne
#3 Le 15/05/2007, à 19:47
- Fenrir
Re : Expressions régulière/filtrage
Merci pour la réponse
Pour le langage, bash à priori, mais pas de prôblème si je dois porter/intégrer le reste de mon code en tcsh/perl/php, du moment que ça reste en script
J'ai essayé de définir une chaîne valide, sans succès pour l'instant car je n'arrive pas à exprimer la règle suivante : une chaîne est valide si et seulement si, elle ne contient QUE certains caractères
Je poursuis mes investigation...
edit : il semble en fait que mon filtrage fonctionne, sauf avec les caractères spéciaux, ¦ par exemple (0166 en décimal), je pense que je vais avoir le même problème si des backquote ou autre se sont glissées dans ma liste
Dernière modification par Fenrir (Le 15/05/2007, à 20:07)
Hors ligne
#4 Le 15/05/2007, à 19:59
- bugman77
Re : Expressions régulière/filtrage
Hello
Je pratique assez bien python. Pour indiquer le complémentaire d'un ensemble, dans le module re (regular expressions), il existe le "^" (cf. http://docs.python.org/lib/re-syntax.html) : par exemple [^5] fait référence à tous les caractères sauf le "5"...
En plus tu as un super utilitaire pour tester tes expressions régulières : kodos
A utiliser sans modération...
Hors ligne
#5 Le 15/05/2007, à 20:10
- Fenrir
Re : Expressions régulière/filtrage
un grep -v [^a-Z0-9._-] marche presque bien, mais comme je l'ai indiqué au dessus, il laisse passer certains caractères
sinon pour kodos, je vais voir ça de suite
Hors ligne
#6 Le 15/05/2007, à 21:13
- JoelS
Re : Expressions régulière/filtrage
un grep -v [^a-Z0-9._-] marche presque bien, mais comme je l'ai indiqué au dessus, il laisse passer certains caractères
Normal, tu fait l'erreur de croire que les caractères alphabétiques se suivent bien gentiment dans la table ASCII! Or les majuscules ne sont pas contigües aux minuscules. Donc quand tu définis la classe [a-Z] tu définis ta classe comme tous les caractéres entre le a minuscule et le Z majuscule dans la table ASCII. Or il y a quelques caractères spéciaux entre le z minsucule et le A majuscule!! Devines lesquels ?
Tu doit écrire [^a-zA-Z0-9._-] pour que ça marche.
Ah, et si tu veux un jour étendre ta classe, ou en faire une autre qui contient des caractères dit diacritiques, faisez gaffe: la définition de la table utilisée dépend de ton 'locale' et donc varie entre ASCII simple et UTF-8. Si tu as besoin de faire des choses compliquées, il vaut mieux passer aux regexp de Perl ou la tu peux utiliser des classes de caractères par leur nom. Dans les cas simples, comme ici, la table ASCII simple est équivalente aux 127 premiers caractères définis par UTF-8, donc ça marchera.
Hors ligne
#7 Le 15/05/2007, à 21:20
- Fenrir
Re : Expressions régulière/filtrage
les caractères suivants :
[
\
]
^
_
`
erreur de ma part, mais il reste encore des caractères qui passent à travers
pour ce qui est de la table à utiliser, je suis en utf8 mais certains caractères sont dans la table étendue , dont je ne veux pas soit dit en passant, je veux rester dans le pool [a-zA-Z0-9_.-]
on avance, merci
edit : si ça peut aider, je vous détail ce que je cherche à faire
j'ai un fichier .passwd qui contient, en plus des comptes systèmes, des comptes bidons sous cette forme :
nom.du.compte:x:33:33:PASSWORD_EN_CLAIR:/un/chemin/LOGIN:/dev/null
le chemin me permet de trouver 2 fichiers, un .forward tout ce qu'il y a de plus classique et un fichier contenant diverses info sur l'utilisateur
le but étant de regrouper toutes ces infos pour les intégrer dans un ldap
comme la tâche doit être automatique, il ne faut pas que des caractères spécieux se glissent dans certains champs
Dernière modification par Fenrir (Le 15/05/2007, à 21:30)
Hors ligne