150 votes

Python: divise une chaîne en majuscules

Quel est le moyen pythonique de diviser une chaîne avant l'occurrence d'un ensemble de caractères donné?

Par exemple, je souhaite fractionner 'TheLongAndWindingRoad' lors de l’apparition d’une lettre majuscule (éventuellement sauf la première) et obtenir ['The', 'Long', 'And', 'Winding', 'Road'] .

Éditer: Il devrait également séparer les occurrences simples, c'est-à-dire que de 'ABC' j'aimerais obtenir ['A', 'B', 'C'] .

206voto

Mark Byers Points 318575

Malheureusement, il n'est pas possible de scinder une correspondance de largeur nulle en Python. Mais vous pouvez utiliser re.findall place:

 >>> import re
>>> re.findall('[A-Z][^A-Z]*', 'TheLongAndWindingRoad')
['The', 'Long', 'And', 'Winding', 'Road']
>>> re.findall('[A-Z][^A-Z]*', 'ABC')
['A', 'B', 'C']
 

53voto

Dave Kirby Points 12310

Voici une solution alternative rationnelle. Le problème peut être reproduit comme suit: "comment insérer un espace avant chaque lettre majuscule avant de scinder":

 >>> s = "TheLongAndWindingRoad ABC A123B45"
>>> re.sub( r"([A-Z])", r" \1", s).split()
['The', 'Long', 'And', 'Winding', 'Road', 'A', 'B', 'C', 'A123', 'B45']
 

Cela présente l'avantage de préserver tous les caractères non blancs, contrairement à la plupart des autres solutions.

21voto

gnibbler Points 103484
 >>> import re
>>> re.findall('[A-Z][a-z]*', 'TheLongAndWindingRoad')
['The', 'Long', 'And', 'Winding', 'Road']

>>> re.findall('[A-Z][a-z]*', 'SplitAString')
['Split', 'A', 'String']

>>> re.findall('[A-Z][a-z]*', 'ABC')
['A', 'B', 'C']
 

Si vous voulez que "It'sATest" se divise en ["It's", 'A', 'Test'] changez le rexeg en "[A-Z][a-z']*"

16voto

pwdyson Points 568

Une variante de la solution de @ChristopheD

 s = 'TheLongAndWindingRoad'

pos = [i for i,e in enumerate(s+'A') if e.isupper()]
parts = [s[pos[j]:pos[j+1]] for j in xrange(len(pos)-1)]

print parts
 

7voto

Gabe Points 49718
 import re
filter(None, re.split("([A-Z][^A-Z]*)", "TheLongAndWindingRoad"))
 

ou

 [s for s in re.split("([A-Z][^A-Z]*)", "TheLongAndWindingRoad") if s]
 

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