2009-06-21 4 views
7


Est-il possible, avec regex, de faire correspondre un mot qui contient le même caractère dans différentes positions?Il est possible de faire correspondre une répétition de caractères avec regex? Comment?

Etat:
Tous les mots ont la même longueur, vous connaissez les positions de caractères (exemple la 1ère, 2e et 4e) du charbon répété, mais vous ne savez pas ce qu'il est.

Exemples:
utilisant des mots 6char minuscules que je voudrais correspondre des mots où le 3e et le 4e caractères sont les mêmes.

parrot <- match for double r 
follia <- match for double l 
carrot <- match for double r 
mattia <- match for double t 
rettoo <- match for double t 
melone <- doesn't match 

Je ne peux pas utiliser le quantificateur [\ d] {2} car il correspond à une succession de deux caractères, et si je dis la 2e et la 4e place au lieu de 3 et 4?

Est-il possible de faire ce que je veux avec regex? Si oui, comment puis-je faire cela?

EDIT:
demandé dans les Poser des commentaires, j'utilise python

+2

Les moteurs d'expressions régulières peuvent différer considérablement entre les langages et les outils. Donc, vous devriez toujours dire quel langage ou outil vous travaillez (Perl? Python? Grep? C et une bibliothèque?) – Telemachus

+0

done! Merci! (15char) –

+0

Est-ce ce devoir? –

Répondre

26

Vous pouvez utiliser un backreference pour ce faire:

(.)\1 

Cela correspondra occurrences consécutives de tout caractère.


Modifier Voici quelques exemples Python:

import re 

regexp = re.compile(r"(.)\1") 
data = ["parrot","follia","carrot","mattia","rettoo","melone"] 

for str in data: 
    match = re.search(regexp, str) 
    if match: 
     print str, "<- match for double", match.group(1) 
    else: 
     print str, "<- doesn't match" 
+1

l'alternative à ceci est (aa | bb | cc | ..zz | AA | BB | lol) – dfa

+0

Assez tard, mais pour référence, il peut être intéressant de noter que cette expression rationnelle correspond à la première répétition du caractère (re.search (r "(.) \ 1", "parrrrrot"). Le groupe (0) donne 'rr'). Pour correspondre à toutes les occurrences (et être capable d'extraire le groupe extensible), vous pouvez utiliser: re.search (r "((.) \ 2+)", "parrrrot"). Group (1) (ce qui donne la bonne réponse answer 'rrrr') – Rick77

2

/(\b\w*?(\w)\2.*?\b)/

correspond à tout mot avec atleast sur la répétition de caractères $ 1 étant le mot $ 2, la première répétition.

7

Vous devez utiliser des références de retour pour de tels cas. Je ne suis pas sûr de la langue que vous utilisez, j'ai essayé l'exemple suivant dans mon éditeur de VI pour rechercher un alphabet qui se répète. Motif Regex:\([a-z]\)\1

Si vous voyez l'exemple, [a-z] est le modèle que vous recherchez, et enferment qu'à l'intérieur du parenthèse (les paranthèses devraient être échappés dans certaines langues). Une fois que vous avez une parenthèse, il s'agit d'un groupe qui peut être référencé n'importe où dans la regex en utilisant \ 1. S'il y a plus d'un groupe, vous pouvez utiliser \ 1, \ 2, etc. \ 1 sera remplacé par ce qui a été trouvé dans le premier groupe.

Merci Arvind

0

Oui, vous pouvez utiliser construction backreference pour correspondre aux doubles lettres.

L'expression régulière (?<char>\w)\k<char>, utilisant des groupes nommés et des références arrières, recherche les caractères appariés adjacents. Lorsqu'il est appliqué à la chaîne «Je vais prendre un petit café», il trouve des allumettes dans les mots «je vais», «petit» et «café».Le métacaractère \w trouve un caractère à un seul mot. La construction de regroupement (?<char>) entoure le métacaractère pour forcer le moteur d'expressions régulières à se souvenir d'une correspondance de sous-expression (qui, dans ce cas, sera un seul caractère) et l'enregistrer sous le nom "char". La construction de référence arrière \k<char> amène le moteur à comparer le caractère courant au caractère précédemment mis en mémoire sous "char". L'expression régulière entière trouve avec succès une correspondance chaque fois qu'un seul caractère est identique au caractère précédent.

+0

Vous devez toujours utiliser des guillemets ou des blocs de code pour formater tout code source que vous incluez dans vos messages. Cette réponse n'avait aucun sens jusqu'à ce que j'ajoute des backticks autour de vos regex. –

+0

Oups !! Ma faute! Merci Alan :) –

Questions connexes