2012-10-02 5 views
16

Ich möchte Python re.split() verwenden, um eine Zeichenfolge in einzelne Wörter durch Leerzeichen, Kommas und Punkte zu teilen. Aber ich möchte nicht "1,200" in ["1", "200"] oder ["1.2"] aufgeteilt in ["1", "2"] geteilt werden.Python re.split() durch Leerzeichen, Kommas und Punkte zu teilen, aber nicht in Fällen wie 1.000 oder 1.50

Beispiel

l = "one two 3.4 5,6 seven.eight nine,ten" 

Das Ergebnis sollte ["one", "two", "3.4", "5,6" , "seven", "eight", "nine", "ten"]

Antwort

37

Verwenden Sie einen negativen Look-Ahead und eine negative Lookbehind sein:

> s = "one two 3.4 5,6 seven.eight nine,ten" 
> parts = re.split('\s|(?<!\d)[,.](?!\d)', s) 
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten'] 

Mit anderen Worten, Sie immer von \s (Leerzeichen) aufgeteilt, und nur durch Kommata und Punkte getrennt, wenn sie nicht gefolgtsindoder vorhergehende (?<!\d) durch eine Ziffer.

DEMO.

EDIT:

> s = "one two 3.4 5,6 seven.eight nine,ten,1.2,a,5" 
> print re.split('\s|(?<!\d)[,.]|[,.](?!\d)', s) 
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten', '1.2', 'a', '5'] 

Diese geteilt wird "1.2,a,5" in ["1.2", "a", "5"]: Wie pro @verdesmarald Kommentar, können Sie die folgenden stattdessen verwenden möchten.

DEMO.

+2

Ich denke, die OP will gefolgt eigentlich nicht * und * fort, statt oder, so sollte es sein '(<\ d?!) | ([.] [.]? ! \ d) 'nicht' (? verdesmarald

+0

@verdesmarald: Vielleicht hast du recht, ich habe meine Antwort bearbeitet, um das zu reflektieren, danke. –

3

Sie möchten also Leerzeichen, Kommas und Punkte trennen, die nicht von Zahlen umgeben sind. Dies sollte funktionieren:

r" |(?<![0-9])[.,](?![0-9])" 
Verwandte Themen