Bonjour,
Suite à un problème entre Google Groups et moi ;), mon message n'a pas
été retransmis ici. J'y indiquai à ejetzer que la soustraction
d'expression rationnelle entière est possible mais délicate. Par
exemple,
[abc]* - ([abc]* bc [abc]*) = (a|c|bb*a)*b*
Pour des expressions rationnelles classiques (sans lookahead et cie),
cette transformation est toujours possible, en passant par les
automates (sur lesquels l'intersection et le complément sont défini).
Pour le faire avec les mains: on peut partir de qui est vérifier sans
problème ici [ac]* et rajouté les cas particuliers bb*a au milieu et
b* à la fin.
Remarquez que certaine bibliothèque d'expression rationnelle et
lexeurs offrent la soustraction, mais pas 're'.
Sur un exemple tiré de la recommandation XML CharData:
CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)
ejetzer indiquait utiliser l'expression rationnelle suivante
>(?!([^<&]* ']]>' [^<&]*))( [^<&]*)
Si on lui donne une la totalité d'une chaîne cela marche bien, mais
pas si l'on veut vérifier le début d'une chaine
re.match(r'(?!([^<&]*\]\]>[^<&]*))([^<&]*)','debut ok]]>') --> None
Pour CharData, une solution (non formellement vérifiée) est: ([^<&\]]|
\][^<&\]]|\]\][^<&>])*]*
Cette expresion doit vérifier le langage défini par CharData, mais sur
re.match(...,"debut ok]]>").group(0) -> "debut ok]]"
Est-ce vraiment ce qu'à besoin un parseur ? Dans une architecture
classique lexeur/parseur, je vous invite à regarder ce qu'on font les
lexeurs pour le traitement des chaînes entre "" ou les commentaires.
Cdt,
Mickaël Delahaye