6
votes

Python: Comment trouver des paires consécutives de lettres par regex?

Je veux trouver des mots qui ont des paires de lettres consécutives à l'aide de Regex. Je sais que pour une seule paire consécutive comme zoo (OO), puzzle (zz), arrangez (RR) , il peut être atteint par '(\ w) {2}' . Mais que diriez-vous de

  • Deux paires consécutives: Comité (TEEE)
  • Trois paires consécutives: Companier (Okkee)

    EDIT:

    • '(\ w) {2}' est vraiment faux, il trouve deux lettres au lieu d'une paire à deux lettres.
    • Mon intention est de trouver les mots qui ont des paires de lettres, pas les paires.
    • par 'consécutif', je veux dire qu'il n'y a pas d'autre lettre entre les paires de lettres.

4 commentaires

Dupliqué possible de Renvoyer des mots avec deux lettres consécutives


\ w {2} fait seulement référence à deux lettres, "AB", "CC" sont les deux ok.


En fait, '(\ w) {2}' correspond à 2 lettres consécutives, correspondant ou non. Il correspondra 'zo' sur 'zoo'.


@zhangyangyu Vous avez raison, merci pour la correction.


4 Réponses :


6
votes

Vous pouvez utiliser ce motif:

[a-z]*([a-z])\1([a-z])\2[a-z]*


8 commentaires

Ça marche! Donc, pour trouver des mots de trois paires de lettres consécutives, la regex serait [AZ] * ([AZ]) \ 1 ([[AZ]) \ 2 [AZ] * ([AZ]) \ 3 [AZ] * , mais il trouve non seulement Companier mais aussi Greté , qui brise la règle «consécutive». Comment éviter cela?


@Teacode: Non pour trois, vous devez écrire: [A-Z] * ([A-Z]) \ 1 ([[A-Z]) \ 2 ([A-Z]) \ 3 [A-Z] *


Vous avez raison! Merci. Sensiez honte de mon erreur, je suis un débutant total avec regex.


@Teacode: Notez que vous pouvez facilement adapter la solution FAFSÉTRU à ce que vous voulez: [A-Z] * (([A-Z]) \ 2) + [A-Z] *


Cela trouve également des mots avec 4 lettres consécutives, par ex. "Heeelp" correspondrait (même si ce n'est pas un vrai mot). Une idée sur la façon de prévenir cela? J'ai essayé ([a-z]) \ 1 ([^ \ 1]) \ 2 mais le moteur de regex que j'utilisais a déclaré qu'il est invalide


@Luke: Vous ne pouvez pas utiliser de correction dans une classe de caractères car \ n (où n est le numéro de groupe de capture) perd son sens spécial à l'intérieur. Si vous souhaitez exclure des mots avec plus de deux lettres consécutives, vous pouvez utiliser un point de vue négatif: \ b (?! [AZ] * ([AZ]) \ 1 {4}) [AZ] * ([ az]) \ 2 ([az]) \ 3 [AZ] *


Je suppose que cela a du sens lorsque vous réalisez une mauvaise interprétation pouvait réellement évaluer à une séquence de plus d'un caractère, de sorte qu'il n'a pas de sens dans une classe de caractères


Bonne réponse. Cela m'aurait aidé à expliquer que "([a-z]) \ 1" correspond à 2 lettres. Expliquez ensuite les deux lettres DOUPLE, sinon je n'ai pas compris toute la chose tout de suite.



15
votes

Utilisez ré.finditer xxx

Vérifiez si la chaîne contient une paire consécutive: xxx

Vous pouvez également utiliser après la non-capture (?: ) Version: < / p> xxx


4 commentaires

Je suppose que ma question a été mal formée. Au lieu de trouver les paires de lettres d'un mot, ce que je veux vraiment faire, c'est de trouver les mots (d'une liste de mots) qui ont des paires de lettres consécutives.


Merci. Maintenant j'ai compris. ((\ w) \ 2) {3} est équivalent à (\ w) \ 1 (\ w) \ 2 (\ w) \ 3 et plus élégant !


Vous pouvez rendre l'ensemble extérieur des parenthèses non capturant, si vous voulez (ce qui semble un peu propre à moi): (?: (\ W) \ 1)


@Blckknght, merci de commenter. J'ai édité la réponse pour mentionner votre version non capturée.



0
votes

Parce que vous avez mentionné que vous souhaitez tester à partir d'une liste, j'ai répondu en tant que tel. Utilisation de la réponse de FALSETU:

newlist = []

for word in list:
  if [m.group() for m in re.finditer(r'((\w)\2)+', word)] != []:
     newlist.append(word)

print newlist


0 commentaires

1
votes

pour détecter les lettres 2 ou plus consécutives La regex devient: (\ w) \ 1 +


0 commentaires