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) strong>, il peut être atteint par EDIT: P>
'(\ w) {2}' code >. Mais que diriez-vous de p>
'(\ w) {2}' code> est vraiment faux, il trouve deux lettres au lieu d'une paire à deux lettres. li>
4 Réponses :
Vous pouvez utiliser ce motif:
[a-z]*([a-z])\1([a-z])\2[a-z]*
Ç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] * code>, mais il trouve non seulement Companier B> mais aussi Greté B>, 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] * Code>
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] * code>
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 code> 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 code> (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] * code>
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.
Utilisez ré.finditer Vérifiez si la chaîne contient une paire consécutive: p> Vous pouvez également utiliser après la non-capture (?: code>) Version: < / p>
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} code> est équivalent à
(\ w) \ 1 (\ w) \ 2 (\ w) \ 3 code> 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) code>
@Blckknght, merci de commenter. J'ai édité la réponse pour mentionner votre version non capturée.
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
pour détecter les lettres (\ w) \ 1 + code> p> p>
Dupliqué possible de Renvoyer des mots avec deux lettres consécutives
\ w {2} code> 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.