Quelle est la manière pythonique de diviser une chaîne avant les occurrences d'un ensemble donné de caractères?
Par exemple, je veux diviser
'TheLongAndWindingRoad'
à toute occurrence d'une lettre majuscule (éventuellement sauf la première) et obtenir
['The', 'Long', 'And', 'Winding', 'Road']
.
Edit: Il devrait également diviser les occurrences uniques, c'est-à-dire que 'ABC'
je voudrais obtenir
['A', 'B', 'C']
.
'[a-zA-Z][^A-Z]*'
comme regex.print(re.findall('^[a-z]+|[A-Z][^A-Z]*', 'theLongAndWindingRoad'))
Voici une solution de regex alternative. Le problème peut être reprasé comme "comment insérer un espace avant chaque lettre majuscule, avant de faire le fractionnement":
Cela présente l'avantage de conserver tous les caractères non blancs, ce que la plupart des autres solutions ne font pas.
la source
Si vous souhaitez
"It'sATest"
fractionner pour["It's", 'A', 'Test']
changer le rexeg en"[A-Z][a-z']*"
la source
drops
tous les mots réguliers (juste alpha) qui ne commencent pas par une lettre majuscule. Je doute que ce fût l'intention du PO.Une variante de la solution de @ChristopheD
la source
Utilisez une anticipation:
Dans Python 3.7, vous pouvez faire ceci:
Et cela donne:
la source
ou
la source
[s for s in re.compile(r"([A-Z][^A-Z]*)").split( "TheLongAndWindingRoad") if s]
donner['The', 'Long', 'And', 'Winding', 'Road']
filter
est la même que la compréhension de liste avec une condition. Avez-vous quelque chose contre?filter(lambdaconditionfunc, ...)
b) en Python 3,filter()
renvoie un itérateur. Ils ne seront donc pas totalement équivalents. c) Je pense quefilter()
c'est aussi plus lentla source
Je pense qu'une meilleure réponse pourrait être de diviser la chaîne en mots qui ne se terminent pas par une majuscule. Cela permettrait de gérer le cas où la chaîne ne commence pas par une majuscule.
exemple:
la source
Solution alternative (si vous n'aimez pas les expressions régulières explicites):
la source
Un autre sans regex et la possibilité de garder des majuscules contiguës si vous le souhaitez
la source
Ceci est possible avec l'
more_itertools.split_before
outil.more_itertools
est un package tiers avec plus de 60 outils utiles, y compris des implémentations pour toutes les recettes itertools originales , ce qui évite leur implémentation manuelle.la source
Une autre façon sans utiliser regex ou enumerate:
Je pense que c'est plus clair et plus simple sans enchaîner trop de méthodes ou en utilisant une longue compréhension de liste qui peut être difficile à lire.
la source
Une autre façon d'utiliser
enumerate
etisupper()
Code:
Production:
la source
Partager ce qui m'est venu à l'esprit lorsque j'ai lu l'article. Différent des autres messages.
la source
La voie pythonique pourrait être:
Fonctionne bien pour Unicode, évitant re / re2.
la source
Remplacez chaque lettre majuscule «L» dans le donné par un espace vide plus cette lettre «L». Nous pouvons le faire en utilisant la compréhension de liste ou nous pouvons définir une fonction pour le faire comme suit.
Si vous choisissez de passer par une fonction, voici comment procéder.
Dans le cas de l'exemple donné:
Mais la plupart du temps que nous divisons une phrase en majuscules, nous souhaitons généralement conserver des abréviations qui sont généralement un flux continu de lettres majuscules. Le code ci-dessous aiderait.
Merci.
la source