11
votes

Fractionnement de mots avec des expressions régulières à Haskell

Il existe plusieurs packages disponibles pour l'utilisation d'expressions régulières dans HASKELLL (E.G. TEXT.REGEX.BASE, TEXT.REGEX.POSIX, etc.). La plupart des forfaits que j'ai vus jusqu'à présent utilisent un sous-ensemble de regex je sais, par lequel je veux dire: je suis habitué à scinder une phrase en mots avec la regex suivante: xxx presque tous les paquets Haskell j'ai essayé jusqu'à présent Ne pas supporter cela (au moins le précédent mentionné et text.regex.tdfa ni). Je sais que avec Posix l'utilisation de [[: mot:] +] aurait le même effet, mais j'aimerais utiliser la variante mentionnée ci-dessus.

de Il y a deux questions:

  1. Y a-t-il un paquet pour archiver cela?
  2. S'il est vraiment, pourquoi y a-t-il une utilisation commune différente?
  3. quels avantages ou inconvénients sont là?

2 commentaires

Avez-vous besoin d'expressions régulières pour diviser les mots? Il y a une fonction mots qui fait exactement ce que vous voulez.


Merci, je ne savais pas cette fonction mais ça ne fait pas ce que je veux. S'il y a des points, des virgules, etc. dans une chaîne, la regex les ignorerait mais mots les attacherait. Par exemple: prélude> mots "juste un test simple." résulterait ["juste", "A", "SIMPLE" "] Je le veux sans le point.


4 Réponses :


11
votes

Le '\ w' est un modèle Perl et pris en charge par PCRE, que vous pouvez accéder à HASKELLL avec mon Regex- PCRE Package ou le Bibliothèque PCRE-Light . Si votre entrée est une liste de caractères, la fonction «mots» dans le prélude standard peut suffire; Si votre entrée est ASCII BYTESTRING, alors Données .Bytestring.char8 peut fonctionner. Il peut y avoir une bibliothèque UTF8 avec la fractionnement de mots, mais je ne peux pas le trouver rapidement.


0 commentaires

6
votes

Si vous souhaitez casser en mots et filtrer des objets autres que des lettres, vous pouvez utiliser le filtre et isalpha code> ou ISALPHANUM code> (ou l'un des autres est code> fonctions dans data.char code> cette suite de votre besoin.)

import Data.Char

wordsButOnlyLetters = map (filter isAlpha) . words


0 commentaires

12
votes

J'utiliserais la suggestion d'Adam ou (peut-être plus lisible) xxx

pas besoin de réégalités ici.


2 commentaires

Juste une note. La division en mots n'est pas égale à cela. Par exemple, wadlesby (pas. Isletter) "Je veux avoir 14 balles." retourner ["" Je veux "," Balls "] , Mais 14 peut être un mot réellement.


@ Дмитрий Ce n'est pas censé être une réponse complète. En fait, \ w est lettres ++ chiffres ++ "_" donc non. Isletter est juste un espace réservé. Je voulais montrer un motif de fractionnement facile et compréhensible.



3
votes

La fonction de mots fonctionne bien, mais cela ressemble plus à "Split by White Space", utilisez SplitEcregex.

import Text.Regex (splitRegex, mkRegex)

splitByWord :: String -> [String]
splitByWord = splitRegex (mkRegex "[^a-zA-Z]+")

>splitByWord "Word splitting with regular expressions in Haskell"
>["Word","splitting","with","regular","expressions","in","Haskell"]


1 commentaires

n'a pas pu trouver le module 'text.regex' peut-être que vous vouliez dire texte.fin