2010-08-04 3 views
3

Je voudrais analyser une chaîne pour obtenir une liste comprenant tous les mots (mots coupés, aussi). Code actuel est:Python regex chaîne à la liste des mots (y compris les mots avec des tirets)

s = '-this is. A - sentence;one-word' 
re.compile("\W+",re.UNICODE).split(s) 

retours:

['', 'this', 'is', 'A', 'sentence', 'one', 'word'] 

et je voudrais qu'il revienne:

['', 'this', 'is', 'A', 'sentence', 'one-word'] 
+0

Pourquoi vous voulez avoir le « »? –

Répondre

1

Vous pouvez utiliser "[^\w-]+" à la place.

+0

Cela reviendrait '-this' mais je ne connais pas de meilleure solution non plus. Je pense qu'il n'y a pas moyen de revenir sur le résultat une fois de plus pour supprimer les inconvénients non désirés. –

0

Yo peut essayer avec la bibliothèque NLTK:

>>> import nltk 
>>> s = '-this is a - sentence;one-word' 
>>> hyphen = r'(\w+\-\s?\w+)' 
>>> wordr = r'(\w+)' 
>>> r = "|".join([ hyphen, wordr]) 
>>> tokens = nltk.tokenize.regexp_tokenize(s,r) 
>>> print tokens 
['this', 'is', 'a', 'sentence', 'one-word'] 

je l'ai trouvé ici: http://www.cs.oberlin.edu/~jdonalds/333/lecture03.html Hope it helps

4

Si vous n'avez pas besoin la principale chaîne vide, vous pouvez utiliser le modèle pour \w(?:[-\w]*\w)?correspondant:

>>> import re 
>>> s = '-this is. A - sentence;one-word' 
>>> rx = re.compile(r'\w(?:[-\w]*\w)?') 
>>> rx.findall(s) 
['this', 'is', 'A', 'sentence', 'one-word'] 

Notez qu'il ne correspond pas à des mots avec comme 012 apostrophes.

+0

merci, ça a marché – Sibish

1

s = "-this is. A - sentence;one-word what's"
re.findall("\w+-\w+|[\w']+",s)

résultat: [ 'ce', 'est', 'A', 'phrase', 'un mot, "ce qui est"]

assurez-vous remarquez que le bon commander est de chercher des mots hyphénés en premier!

2

Voici ma traditionnelle « pourquoi utiliser la langue de regexp lorsque vous pouvez utiliser Python » alternatif:

import string 
s = "-this is. A - sentence;one-word what's" 
s = filter(None,[word.strip(string.punctuation) 
       for word in s.replace(';','; ').split() 
       ]) 
print s 
""" Output: 
['this', 'is', 'A', 'sentence', 'one-word', "what's"] 
""" 
Questions connexes