[regexp] lookbehind
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
bonjour,
j'ai un petit problème agaçant.
c'est simple, je veux dans un texte constitué de lignes de plusieurs mots ou d'un seul, ne faire une substitution dans un mot que si ce mot, de longueur inconnue, ne commence pas par une séquence précise.
théoriquement, en perl en tout cas, il me semble que ça relève d'un lookbehind
par exemple, mettons que je veuille changer tous les i en W dans tous les mots ne commençant pas par paf
soit, aller de:
sirop nimo pafcouic tralalilère pinpafpon pifpaf laloulère cuicui pafcitron
à
sWrop nWmo pafcouic tralalWlère pWnpafpon pWfpaf laloulère cuWcuW pafcitron
or, le lookbehind ne permet pas de longueur de chaîne variable:
on peut faire
par exemple, mais pas
j'ai du mal à croire que ce soit impossible de ne faire de substitution sur des mots que s'ils ne commencent pas par une chaîne donnée
si quelqu'un a une solution à me proposer, je préfère du perl à cause d'une substitution particulière (s/=([0-9a-fA-F]{2})/chr hex $1/g) et avec sed mettons, y a un foirage (\x\1 n'est pas interprété lors de la substitution)
merci
j'ai un petit problème agaçant.
c'est simple, je veux dans un texte constitué de lignes de plusieurs mots ou d'un seul, ne faire une substitution dans un mot que si ce mot, de longueur inconnue, ne commence pas par une séquence précise.
théoriquement, en perl en tout cas, il me semble que ça relève d'un lookbehind
par exemple, mettons que je veuille changer tous les i en W dans tous les mots ne commençant pas par paf
soit, aller de:
sirop nimo pafcouic tralalilère pinpafpon pifpaf laloulère cuicui pafcitron
à
sWrop nWmo pafcouic tralalWlère pWnpafpon pWfpaf laloulère cuWcuW pafcitron
or, le lookbehind ne permet pas de longueur de chaîne variable:
on peut faire
perl -pe 's/(?<!\bpaf\S{3})i/W/g'
par exemple, mais pas
perl -pe 's/(?<!\bpaf\S*)i/W/g'
j'ai du mal à croire que ce soit impossible de ne faire de substitution sur des mots que s'ils ne commencent pas par une chaîne donnée
si quelqu'un a une solution à me proposer, je préfère du perl à cause d'une substitution particulière (s/=([0-9a-fA-F]{2})/chr hex $1/g) et avec sed mettons, y a un foirage (\x\1 n'est pas interprété lors de la substitution)
merci
2 réponses
Salut,
Vu qu'y a pas de réponse...
J'avais fait un exo qui ressemble à ton problème lors d'une initiation à PERL.
Le formateur nous avais dit que c'était pas possible via une regex, il fallait
passer par programme. Je te files le code, si ça peut t'aider :
C'était un stage avec perl 5.8.x. Le titre du chapitre : les limites des regex.
A+, crabs
Vu qu'y a pas de réponse...
J'avais fait un exo qui ressemble à ton problème lors d'une initiation à PERL.
Le formateur nous avais dit que c'était pas possible via une regex, il fallait
passer par programme. Je te files le code, si ça peut t'aider :
#!/usr/bin/perl
# faire des remplacements dans des mots lut sur l'entrée standard
# le résultat sera sur la sortie standard
# les mots ayant un préfixe ne devront pas être touché par le remplacement
# ./remplace.pl prefixe cherche remplace
$prefix = $ARGV[0] ;
$cherche = $ARGV[1] ;
$remplace = $ARGV[2] ;
while ( $ligne = <STDIN> )
{
$_ = $ligne ; $fin = $ligne ;
while ( /\b${prefix}\S*/ )
{
$debut = $` ;
$fin = $' ;
$mot = $& ;
$debut =~ s/${cherche}/${remplace}/g;
print $debut, $mot ;
$_ = $fin ;
}
$fin =~ s/${cherche}/${remplace}/g;
print $fin ;
}
C'était un stage avec perl 5.8.x. Le titre du chapitre : les limites des regex.
A+, crabs