2010-08-12 12 views
2

Je cherche une expression rationnelle qui trouve tous les mots d'une liste qui n'ont pas de caractères les uns à côté des autres qui sont identiques. (Ceci est un exercice)Alterner les caractères et les parenthèses imbriquées (e) grep

Alors abcdef est imprimé, mais aabcdef ne l'est pas.

J'ai essayé deux

egrep "^((.)[^\1])*$" 

et egrep "^ ((.) [^ \ 2]) * $" mots mais, autre que d'être pas sûr que l'on aurait droit, ils n » t travail.

Je sais que je peux aller egrep -v "(.)\1", mais je veux utiliser la regex dans une structure OR avec d'autres, ce n'est pas possible.

Pour les intéressés, l'exercice complet est de trouver tous les mots qui ont exactement deux paires de caractères, de sorte aacbb et aabbd, mais sont adaptées abcd et aabbcc ne sont pas.

Merci,

Répondre

0

egrep est déprécié. utiliser grep -E

par exemple

echo "aacbb" | grep -E "(\w)\1" 
+0

pourriez-vous expliquer ce que fait? Est-ce juste un remplacement de [A-Za-z]? – thepandaatemyface

0

est-egrep une exigence? Ou pouvons-nous passer à quelque chose de plus puissant comme perl, python etc?

A penser un regard négatif affirmation avant fonctionnerait ici:

#!/usr/bin/env python 

import re 

test1 = "abcdef" 
test2 = "aabcdef" 
test3 = "abbcdef" 

r = re.compile(r"^(?:(.)(?!\1))*$") 

assert r.match(test1) is not None 
assert r.match(test2) is None 
assert r.match(test3) is None 

je suppose que la version deux groupes peut être faite en combinant trois de ces expressions avec ceux qui font paires de match.

+0

qui dit * outils nix ne sont pas puissants? :) – ghostdog74

+0

c'est pour le travail scolaire, donc je crains que seulement grep est autorisé (comment stupide cela pourrait être) – thepandaatemyface