2012-11-03 17 views
47

Jaki jest najlepszy sposób podziału ciągu, jak "HELLO there HOW are YOU" przez wielkie litery (w języku Python)?Python split string oparty na regex

Więc chciałbym skończyć z tablicy takich jak: results = ['HELLO there', 'HOW are', 'YOU']


EDIT:

Próbowałem:

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

To nie wydaje się działać, choć .

+2

[Co próbowałeś] (http://www.whathaveyoutried.com)? - Nie można znaleźć ['' re.split() ''] (http://docs.python.org/3/library/re.html#re.split)? –

+1

Kiedy mówisz, że coś nie działa, powinieneś wyjaśnić dlaczego. Czy otrzymujesz wyjątek? (Jeśli tak, opublikuj cały wyjątek) Czy otrzymujesz błędne dane wyjściowe? –

Odpowiedz

55

Proponuję

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

Skontrolować this demo.

7

Nie trzeba dzielić, ale raczej findall:

re.findall(r'[A-Z]+[^A-Z]*', str) 
+2

To dzieli się na kolejne wielkie litery, a nie na wielkie litery. –

+2

@ m.buettner: Nie wiem, co masz na myśli przez "słowo". – georg

+0

Zobacz jego przykład. Słowo składające się wyłącznie z wielkich liter. I wziąłbym słowo, jako coś, co jest pomiędzy (regex) granicami słów. Twoje podzieliłoby 'someThing' pomiędzy' some' a 'Thing' –

25

Można użyć uprzedzona:

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

ten zostanie podzielony na każdym miejscu, które jest następnie ciąg Ograniczenie górne litery liter kończące się na granicy wyrazów.

Należy zwrócić uwagę, że nawiasy kwadratowe są przeznaczone wyłącznie do odczytu i równie dobrze można je pominąć.

Jeśli to wystarczy, że pierwsza litera wyrazu jest górna obudowa (więc jeśli chcesz podzielić przed Hello również) to staje się jeszcze łatwiejsze:

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

Teraz dzieli na każdym spacja, po której następuje dowolna wielka litera.

+1

Jak mogę zmienić 're.split (r '[ ] (? = [AZ] + \ b) ", wejście)", więc nie znalazł wielkich liter? Na przykład. Nie pasowałoby do "A"? Próbowałem 're.split (r '[] (? = [A-Z] {2,} + \ b)", input) '. dzięki! –

+0

@JamesEggers Masz na myśli to, że chcesz wymagać co najmniej dwóch wielkich liter, abyś nie podzielił słów takich jak "Ja"? 're.split (r '[] (? = [A-Z] {2,} \ b)", input) 'powinno to zrobić. –

+2

Proponuję przynajmniej '[] +' lub nawet '\ W +', aby złapać nieco więcej przypadków. Mimo to, dobra odpowiedź. – georg