J'ai un grand ensemble de texte du monde réel que j'ai besoin de tirer des mots pour entrer dans un vérificateur orthographique. J'aimerais extraire autant de mots em> significatifs que possible sans trop de bruit. Je sais qu'il y a beaucoup de ninjas regex ici, j'espère que quelqu'un peut m'aider. P>
Actuellement, j'explète toutes les séquences alphabétiques avec Cependant, je serais également heureux de pouvoir simplement obtenir toutes les séquences alphabétiques qui ne sont pas adjacentes à un numéro. Donc, par exemple J'ai essayé Plus de détails: strong> Les données sont une base de données de messagerie, c'est donc surtout l'anglais normal avec des nombres normaux, mais il y a occasionnellement des cordes de déchets comme '[A-Z] +' code>. C'est une approximation correcte, mais elle traîne beaucoup de déchets avec elle. P>
[/ -_ ,.: ] code> etc.), et ignore toutes les séquences alphabétiques avec des limites illégales. P>
'pie21' ' code> n'entraînerait pas
' pie ' code>, mais
' http://foo.com ' code> extraire
[ 'http', 'foo', 'com'] code>. p>
lookahead code> et
lookbehind code> assertions, mais ils ont été appliqués par caractère (donc par exemple
re.findall ('(? retournerait
' pi ' code> quand je veux ne rien retourner). J'ai essayé d'envelopper la partie alpha en tant que terme (
(?: [A-Z] +) code>) mais cela n'a pas aidé. P>
gihq4nwl0s5scgbdd40zxe5idp13tynea code> et
AC7A21C0 code> que j'aimerais ignorer complètement. Je suppose une séquence alphabétique avec un nombre en elle est des ordures. P>
4 Réponses :
Si vous vous limitez aux lettres ASCII, utilisez (avec le jeu d'options CODE> RE.I CODE>)
\b[^\W\d_]+\b
Cela ressemble exactement à ce que je veux, mais je ne peux pas obtenir le ballon \ b code> s pour fonctionner. Avec
texte code> défini comme une phrase normale,
re.findall ('\ b [a-z] + \ b', texte, re.i) code> ne renvoie rien. Peu importe ce que j'ai mis sur les crochets (ou en utilisant
recherche code> ou
correspondant code>) il ne semble pas aider non plus. Utilisation de
\ B code> me donne des résultats, mais enregistre le premier et le dernier caractère de chaque mot. Aussi paresseux que ça sonne, je suis trop fatigué pour prendre un nouveau concept en ce moment; Avez-vous des chances que vous sachiez pourquoi cela ne fonctionne pas? Ou que vous pouvez poster un exemple littéral de la façon dont vous l'utiliseriez dans ce cas?
C'est exactement i> pourquoi j'ai écrit mon commentaire à votre question. Si vous n'utilisez pas de chaînes brutes ( r "\ b [a-z] \ b" code>), le
\ b code> sera interprété comme un caractère arrière.
OOOOOOOOOOOOOH, c'est ce que vous vouliez dire :). Désolé, il est maintenant 5h30 ici et je n'allais jamais faire ce lien. Ajoutez simplement le R et ça marche un régal! Merci Monsieur.
En général, cela fonctionne, mais cela échouera sur des mots avec des caractères spéciaux (par exemple wenn bei beförderungen schäden code>)
@yekta: non si vous compilez la rééglementation à l'aide du re.unicode code> ou
re.locale code> option. Je devrais ajouter ça à ma réponse.
Êtes-vous familiarisé avec limites de mots? ( par exemple, cela saisira des mots entiers mais s'arrêtera à des jetons tels que des traits d'union , périodes, semi-couches, etc. p> Vous pouvez la séquence Modifier strong> aussi, si vous souhaitez environ un numéro ou le match précédent , vous pouvez utiliser un look négatif / derrière: p> \ b code >). Vous pouvez extraire des mots à l'aide du
\ b code> autour de la séquence et correspondant à l'alphabet dans:
\ b code> et d'autres, sur le manuel de Python p>
Selon la réponse de Tim, \ b code> sonne comme ce que je veux, mais ça ne joue pas bien. Des idées? J'ai déjà essayé la lunette et regarder les regards avant, mais ils semblent correspondre à tous les personnages jusqu'à ce que le personnage adjacente à un nombre, et n'ignore donc pas complètement les mots avec des chiffres. En outre, il se plaint de regarder des motifs de largeur fixe avec ceux-ci + s.
@ Pie21: utilisez ensuite une correspondance à un chiffre. Nous ne nous soucions pas du nombre de numéros post / précédent, juste qu'il y a un chiffre. Exemple
J'ai eu ce travail [re.findall (r "\ b ([a-za-z] +) \ b", contenu, re.i)] mais il ne semble pas être éliminé en avant et à back-slashes. Voici quelques mots qui sont sortis: '[endif]', '$', '8', '/ petit', '/ li'
Qu'en est-il de: Notez que: p> edit em>: Ajout de certaines explications p> p>
Laid tel qu'il est, ça marche! À votre santé! Cependant, puis-je poser une préférence supplémentaire: puisque je ne parle pas Lambda ou filtrer, est-il un moyen de faire ce genre de chose avec re.finditer () code>? J'ai besoin de suivre les indices de début et de fin de chaque match dans le texte.
exemple de code ou p>
Mieux vaut utiliser des chaînes brutes avec des regexes.
\ d code> arrive à fonctionner, mais d'autres séquences d'échappement échoueront, et cela peut être difficile à déboguer.