Chaîne divisée en Python basée sur l'expression régulière


114

Quelle est la meilleure façon de diviser une chaîne "HELLO there HOW are YOU"par des mots en majuscules (en Python)?

Donc, je finirais avec un tableau comme celui-ci: results = ['HELLO there', 'HOW are', 'YOU']


ÉDITER:

J'ai essayé:

p = re.compile("\b[A-Z]{2,}\b")
print p.split(page_text)

Cela ne semble pas fonctionner, cependant.


2
Qu'avez-vous essayé ? - Vous n'avez pas pu trouver re.split()?
Gareth Latty

5
Lorsque vous dites que quelque chose ne fonctionne pas, vous devez expliquer pourquoi. Obtenez-vous une exception? (Si tel est le cas, postez l'exception dans son intégralité) Avez-vous une mauvaise sortie?
Gareth Latty

Réponses:


134

je suggère

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s)

Regardez cette démo .


5
que se passe-t-il lorsque vous n'utilisez pas compile?
Feelsbadman

3
Selon la documentation de référence , "la plupart des opérations d'expressions régulières sont disponibles sous forme de fonctions au niveau du module et de méthodes RegexObject. Les fonctions sont des raccourcis qui ne vous obligent pas à compiler d'abord un objet regex, mais qui manquent certains paramètres de réglage fin. " Vous pouvez utiliser re.split(re.split(pattern, string, maxsplit=0, flags=0))comme mentionné dans les documents précédemment cités.
ZaydH

57

Vous pouvez utiliser une anticipation:

re.split(r'[ ](?=[A-Z]+\b)', input)

Cela sera divisé à chaque espace suivi d'une chaîne de lettres majuscules qui se terminent par une limite de mot.

Notez que les crochets sont uniquement destinés à la lisibilité et pourraient également être omis.

S'il suffit que la première lettre d'un mot soit en majuscules (donc si vous souhaitez également séparer devant Hello), cela devient encore plus facile:

re.split(r'[ ](?=[A-Z])', input)

Maintenant, cela se divise à chaque espace suivi de toute lettre majuscule.


1
Comment changerais-je re.split(r'[ ](?=[A-Z]+\b)', input)pour qu'il ne trouve pas de lettres majuscules? Par exemple, cela ne correspondrait pas à "A"? J'ai essayé re.split(r'[ ](?=[A-Z]{2,}+\b)', input). Merci!

@JamesEggers Vous voulez dire que vous voulez exiger au moins deux lettres majuscules, pour ne pas vous séparer à des mots comme I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)devrait le faire.
Martin Ender

2
Je suggérerais au moins [ ]+ou peut-être même \W+d'attraper un peu plus de cas. Pourtant, une bonne réponse.
georg

J'ai essayé la même approche. Cependant, avoir un [ ]ne fonctionnait pas pour moi. Au lieu de cela, j'ai utilisé \s. L'expression re.split("\s(?=[A-Z]+\s)", string)
régulière

0

Votre question contient la chaîne littérale "\b[A-Z]{2,}\b", mais cela \bsignifiera un retour arrière, car il n'y a pas de modificateur r.

Essayez: r"\b[A-Z]{2,}\b".

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.