Stringa divisa in Python basata su regex


114

Qual è il modo migliore per dividere una stringa come "HELLO there HOW are YOU"per parole maiuscole (in Python)?

Quindi finirei con un array come questo: results = ['HELLO there', 'HOW are', 'YOU']


MODIFICARE:

Ho provato:

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

Tuttavia, non sembra funzionare.


2
Cosa hai provato ? - Non hai trovato re.split()?
Gareth Latty

5
Quando dici che qualcosa non funziona, dovresti spiegare perché. Ottieni un'eccezione? (In caso affermativo, posta l'intera eccezione) Ottieni l'output sbagliato?
Gareth Latty

Risposte:


134

suggerisco

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

Controlla questa demo .


5
cosa succede quando non usi compile?
Feelsbadman

3
Secondo i documenti , "la maggior parte delle operazioni di espressioni regolari sono disponibili come funzioni a livello di modulo e metodi RegexObject. Le funzioni sono scorciatoie che non richiedono di compilare prima un oggetto regex, ma mancano di alcuni parametri di regolazione fine " .re.split(re.split(pattern, string, maxsplit=0, flags=0)) come menzionato nei documenti precedentemente citati.
ZaydH

57

Potresti usare un lookahead:

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

Questo verrà suddiviso in ogni spazio seguito da una stringa di lettere maiuscole che terminano con un confine di parola.

Nota che le parentesi quadre sono solo per la leggibilità e potrebbero anche essere omesse.

Se è sufficiente che la prima lettera di una parola sia maiuscola (quindi se vuoi dividerla anche davanti Hello) diventa ancora più semplice:

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

Ora questo si divide in ogni spazio seguito da qualsiasi lettera maiuscola.


1
Come cambierei in re.split(r'[ ](?=[A-Z]+\b)', input)modo che non trovasse lettere maiuscole? Ad esempio, non corrisponderebbe alla "A"? Ho provato re.split(r'[ ](?=[A-Z]{2,}+\b)', input). Grazie!

@JamesEggers Intendi dire che vuoi richiedere almeno due lettere maiuscole, in modo da non dividere in parole come I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)dovrebbe farlo.
Martin Ender

2
Suggerirei almeno [ ]+o forse anche \W+di catturare un po 'più di casi. Comunque, una buona risposta.
georg

Ho provato lo stesso approccio. Tuttavia, avere un [ ]non ha funzionato per me. Invece, ho usato \s. L' re.split("\s(?=[A-Z]+\s)", string)
espressione regolare

0

La tua domanda contiene la stringa letterale "\b[A-Z]{2,}\b", ma ciò \bsignificherà backspace, perché non esiste un modificatore r.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.