8
votes

Python String Motif Reconnaissance / Compression

Je peux faire de la regex de base bien, mais c'est légèrement différent, à savoir je ne sais pas ce que le motif va être.

Par exemple, j'ai une liste de chaînes similaires: P>

c = ['sometxt', 'moretxt']

v = [('a','0'), ('b','1'), ('aa','10'), ('zz','999')]


5 commentaires

Cela semble dur. Cela pourrait vous aider si vous avez donné plus de fond, comme indiquer pourquoi vous devez utiliser exactement ce schéma de compression.


Attendez, vous ne savez pas ce que extext et mORETTXT sont et où ils sont? ce serait tout à fait un tour alors


Oui! Donnez-nous des cas de test!


Désolé si je ne me suis pas rendu clair dans la question, non je n'ai aucune connaissance de ce que "parfois" et / ou "moretext" va être. Les entrées sont une série d'utilisateurs définissent des textes et des séquences de caractères générées par machine. Je dois savoir quelles sont les chaînes statiques et quelles sont les séquences dynamiques de chaque élément d'entrée.


Que diriez-vous de rechercher un outil externe tel que FAK: github.com/noprompt/frak


6 Réponses :


-1
votes

Que diriez-vous de supprimer le texte connu, puis de la division? XXX


6 commentaires

Op ne sait pas ce que anorming et moretext sont


@Silenthost Je ne suis pas sûr s'il ne le fait ou pas, pour être honnête. La question le laisse assez floue.


@Mavnn: Lisions-la à nouveau: Je ne sais pas ce que le motif va être.


@Silentghost: étant donné qu'il suit Je peux faire de la regex de base ... Il pourrait être lu comme Je ne sais pas comment construire le modèle de regex requis plutôt que Je ne connais pas le modèle de Morext et Moretxt . C'est une question beaucoup plus intéressante dans ce dernier cas, cependant.


C'est ce que veut.


Oui, j'ai pensé à réapparaître d'abord - mais ça part parfois et plus de Moretext dans le résultat. Req + Split semblait être moins de pas pour obtenir les résultats demandés.



1
votes

Je suppose que vous devriez commencer par identifier des sous-chaînes (motifs) qui se produisent fréquemment dans les cordes. Depuis que compter naïvement des substrings dans un ensemble de chaînes est plutôt coûteux, vous aurez besoin de trouver quelque chose d'intelligent.

J'ai fait la sous-chaîne comptant sur une grande quantité de données à l'aide de ARBRES SUPPLIX GÉNÉRÉS < Un href = "http://cosmion.net/jeren/software/gst/" rel = "Nofollow Noreferrer"> (exemple ici) . Une fois que vous connaissez les sous-chaînes / motifs les plus fréquents dans les données, vous pouvez le prendre à partir de là.


0 commentaires

3
votes

Voici un effrayant pour obtenir le roulement de la balle. XXX

J'espère que sa laideur pure inspirera de meilleures solutions :)


4 commentaires

Belle solution, un peu lent, mais je peux attendre. La laideur ne me dérange pas, bon code vaut plus que de l'or. Jamais pensé à utiliser Regex de cette façon, mais c'est bien au-delà de mes connaissances de base surgex. J'essaie de déterminer comment séparer la sortie en une liste séparée de constantes et de variables.


@icy, cela fonctionne de manière significative plus rapide si un personnage n'est jamais rencontré dans les données d'entrée, comme '\ 0'. Dans ce cas, remplacez les deux «.join avec '\ 0'.Join. Cela donne également un résultat plus joli.


Brillant! Oui, les cordes ne contiennent que des caractères imprimables. '\ 0'.Join a fait beaucoup plus vite.


Oui, cela accélère beaucoup. Ma solution est toujours 200 fois plus rapide, cependant :-) Avoir plus de cas de test serait bien ...



8
votes

Cette solution trouve les deux sous-chaînes courantes les plus longues et les utilise pour délimiter les chaînes d'entrée: xxx

Find_Delimiters et amis trouve les délimiteurs: < Pré> xxx

split_strings divise les chaînes à l'aide des délimiteurs: xxx


3 commentaires

Avoir un uppote pour contrer (et un peu) le hasard Driveby. Il y a des choses intéressantes et utiles dans votre réponse.


Nous pourrions utiliser une version différente de Python, 2.4.3 est ce que j'utilise. J'ai eu TypeError: min () ne prend aucun argument de mots clés.


Oui, je suis sur 2,5. J'ai édité la réponse pour le faire fonctionner avec 2,4




2
votes

Cela semble être un exemple de Problème de recherche courante le plus long . Une solution pourrait être de regarder comment DIFFS est généré. Le Algorithme Hunt-McIlroy semble avoir été le premier et est tel que le plus simple, surtout que cela apparaît apparemment non heuristique.

Le premier lien contient des exemples de codes de discussion détaillés et (pseudo). En supposant, bien sûr, je ne suis pas complètement de la piste ici.


1 commentaires

Oui, j'ai pensé à la diff. De plus, je ne sais rien où commencer.