725 votes

Séparé avec

Bizarre - je pense que ce que je veux faire est une tâche assez courante mais je n’ai trouvé aucune référence sur le web. J’ai le texte, avec des signes de ponctuation, et je tiens un tableau des mots. C’est à dire - doit être . Mais de python `` ne fonctionne qu’avec un seul argument... donc j’ai tous les mots avec ponctuation après que j’ai partagé avec des espaces blancs. Toutes les idées ?

Merci

634voto

gimel Points 30150

re.split()

re.split(pattern, string[, maxsplit=0])

Scinde une chaîne par les occurrences du motif. Si la capture d'parenthèses sont utilisées dans le modèle, puis le texte de tous les groupes dans le modèle sont aussi retournés dans le cadre de la liste résultante. Si maxsplit est différente de zéro, dans la plupart des maxsplit divisions se produisent, et le reste de la chaîne est retournée comme le dernier élément de la liste. (Incompatibilité remarque: à l'origine, Python 1.5 libération, maxsplit a été ignorée. Ce problème a été corrigé dans les versions ultérieures).

>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('\W+', 'Words, words, words.', 1)
['Words', 'words, words.']

521voto

RichieHindle Points 98544

Un cas où les expressions régulières sont justifiées:

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

[Modifié pour inclure ' dans la parole des personnages - merci, Danosaure.]

425voto

Louis LC Points 813

Un autre moyen rapide de le faire sans une regexp est de remplacer les personnages tout d'abord, comme ci-dessous:

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']

351voto

EOL Points 24342

Si de nombreuses réponses, mais je ne trouve pas de solution qui répond efficacement à ce que le titre de l'questions littéralement demande (fractionnement avec plusieurs séparateurs-en revanche, de nombreuses réponses supprimer tout ce qui n'est pas un mot). Voici donc une réponse à la question dans le titre ("string split avec plusieurs séparateurs"), qui s'appuie sur le langage Python standard et efficace, re module de:

>>> import re
>>> filter(None, re.split("[:, \-!?]+", "Hey, you - what are you doing here!?"))  # Multiple separators
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

où l' filter(None, …) supprime des chaînes vides (bool("") est False). L' re.split() précisément "splits avec plusieurs séparateurs", comme demandé dans la question du titre. L' re module est beaucoup plus efficace que de le faire en Python des boucles et des tests "à la main".

58voto

ghostdog74 Points 86060

Une autre façon, sans regex

import string
punc = string.punctuation
thestring = "Hey, you - what are you doing here!?"
s = list(thestring)
''.join([o for o in s if not o in punc]).split()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X