0
votes

Trouver une séquence de caractères dans la chaîne

Utilisation de Python, j'essaie de trouver une séquence de caractères dans une chaîne en spécifiant la longueur de cette chaîne de caractères.

Par exemple, si nous avons la variable suivante, je veux extraire une séquence identique de caractères avec une longueur de 5: xxx

Le résultat doit être: xxx

Comment puis-je faire ça?


8 commentaires

compteur pourrait être votre ami.


Vous devez utiliser Regex pour faire correspondre une expression répétée. Ce message devrait aider: Stackoverflow.com/a/1660739/7692562


@ user5173426, pouvez-vous élaborer? Compteur Par lui-même ne vous dit rien des points consécutifs de caractères identiques.


Ce n'est pas un site FO-Your-Tewwork-for-Your-Your, ni c'est un site de tutoriel pour les personnes qui ne connaissent aucune programmation du tout. Pour assurer une réponse, veuillez montrer ce que vous avez essayé jusqu'à présent.


@ user5173426 compteur n'est pas utile ici car les caractères doivent être adjacents, itheroTools.groupby pourrait être utilisé si


@JDEHESA Pourquoi avez-vous supprimé votre réponse?


@ user5173426 Je pense que j'ai mal compris l'Op, je pense qu'ils signifient "Identifier les séquences de caractères n caractères identiques, non" Identifier les séquences identiques N -long dans la chaîne ".


Mieux vaut obtenir mon café.


6 Réponses :


3
votes

iTerTools code> à la rescousse :) xxx pré>

EDIT: Noming bien p>

>>> [k*val for k, g in itertools.groupby(x) if sum(1 for _ in g) == val]


0 commentaires

1
votes

La réponse originale (ci-dessous) est pour un problème différent (identification des motifs répétés de N code> dans la chaîne). Voici une doublure possible pour résoudre le problème:

**111
**111
*1111
*1111
11111
11111
1111*
1111*
111**
111**


1 commentaires

Bien que c'est pour un problème différent, j'ai aimé cela. +1



0
votes

Essayez ceci:

11111
11111


0 commentaires

2
votes

ou si vous allez bien avec l'utilisation de regex, rend votre code beaucoup plus propre: xxx

REGEX101 - Exemple


4 commentaires

Ce modèle correspond effectivement à la séquence que OP recherche. Mais recherche ne trouve que la première instance. Est-il possible de trouver toutes les cas ?


@Hansolo, qui fonctionne pour l'échantillon de l'OP, mais je pense qu'il souhaite également des séquences qui ne contiennent pas le caractère "1". Par exemple, "22222 foo qqqqq" devrait renvoyer ["22222", "qqqqq"]


@Kevin alors quelque chose comme ',' .join (y * 5 pour y dans re.findall (r '(.) \ 1 {4}', x))


A l'air bien, maintenant :-) J'espérais qu'il y aurait une solution basée sur la suite qui ne capture que et exactement les séquences complètes, de sorte qu'aucune carte de liste ne soit requise. Mais je ne pense pas que vous puissiez faire correspondre la séquence sans capturer le premier caractère par lui-même.



1
votes

solution très laid: -)

x = "jhg**11111**jjhgj**11111**klhhkjh22222jhjkh1111"
for c, i in enumerate(x):
    if i == x[c+1:c+2] and i == x[c+2:c+3] and i == x[c+3:c+4] and i == x[c+4:c+5]:
        print(x[c:c+5])


2 commentaires

Conseil de style: envisagez d'utiliser pour C, i en énumérant (x): au lieu d'incrémenter manuellement une variable de comptage.


Merci. J'ai édité mon code. Toujours moche, mais devrait travailler :-)



0
votes

Modifions un peu votre chaîne source: xxx pré>

La regex devrait être: p> xxx pré>

ici, vous avez un groupe de capture (A Char) et une brouillon à celui-ci (4 fois), donc totalement le même caractère doit se produire 5 fois. p>

une variante pour imprimer le résultat, bien que moins intuitif est: p>

 5: 11111
19: 22222
33: 33333
43: 44444


0 commentaires