2017-02-13 2 views
0

Ich habe eine Zeichenfolge, die ich mit einem regulären Ausdruck teilen möchte.Splitting auf einem regulären Ausdruck

Input:

S1:1- first split begins.s2:1- first split ends.s1:2-second split begins.S2:2-second split ends,S1:3-third split begins.S2:3-third split ends. 

Output: sollte eine Liste sein, den Ausdruck enthält, auf die wir

[S1 aufgeteilt: 1-first Split beginnt, s2: 1-first Spliss, S1: 2 -zweiten Split beginnt, S2: 2-Sekunden-Spliss, S1: 3-dritte Teil beginnt .....]

ich auf Muster teilen möchten [s/S][1/2]:[0-9][0-9]
Das ist, was ich habe, aber es gibt mir eine zusätzliche Zeile und entfernt den Regex, auf dem ich aufgeteilt habe.

import re 
text="""S1:1- first Split begins.continue the sentence 
     s2:1- first split ends 
     s1:2-second split begins 
     S2:2-second split ends 
     S1:3-third split begins 
     S2:3-third split ends """ 
output=re.split("[Ss][12]:[0-9]*", text) 
+0

Können Sie fügen Sie bitte, was Sie als ausgeben wollen. –

+0

Betrachten Sie das Teilen einfach durch '\ n' etwas wie' re.split ("\ n", Text) ' – Ibrahim

+0

Es ist nicht notwendig, dass wir a \ n haben. Der Text könnte eine einzige große Zeichenfolge sein. – AMisra

Antwort

2

Try positive Vorschau (?= CODE) in Regex zu verwenden, um dies Ihre Regex zu erhalten, um zu erreichen. Ihre regex wird so etwas wie dieses:

\s(?=[sS][12]:[0-9]) 

komplette Code:

import re 
text="""S1:1- first Split begins.continue the sentence 
     s2:1- first split ends 
     s1:2-second split begins 
     S2:2-second split ends 
     S1:3-third split begins 
     S2:3-third split ends """ 
output=re.split("\s(?=[sS][12]:[0-9])", text) 

Ergebnis:

['S1:1- first Split begins.continue the sentence\n ', 's2:1- first split ends\n ', 's1:2-second split begins\n ', 'S2:2-second split ends\n ', 'S1:3-third split begins\n ', 'S2:3-third split ends '] 
2

Ich bin nicht ganz sicher, ob ich verstehe, wo Sie diese Eingabe teilen wollen, aber wenn Sie den Text mögen, dass Sie Aufspalten auf in der Ausgabe aufgenommen werden, dann müssen Sie ein Aufnahmemuster haben:

re.split("([Ss][1-2]:[0-9]-)\s*", text) 

Ergebnis:

['', 
'S1:1-', 
'first Split begins.continue the sentence\n  ', 
's2:1-', 
'first split ends\n  ', 
's1:2-', 
'second split begins\n  ', 
'S2:2-', 
'second split ends\n  ', 
'S1:3-', 
'third split begins\n  ', 
'S2:3-', 
'third split ends '] 
+0

Ja, ich möchte, dass der Text, auf den ich splittere, in der Ausgabe enthalten ist. Warum erhalten wir an der ersten Position in der Ausgabeliste eine zusätzliche Leerzeile? – AMisra

+1

So funktioniert Split; aus der Dokumentation: "Wenn es Abfanggruppen im Separator gibt und sie am Anfang der Zeichenfolge übereinstimmen, wird das Ergebnis mit einer leeren Zeichenfolge beginnen. Dasselbe gilt für das Ende der Zeichenfolge." Ehrlich gesagt, nachdem Sie die Look-Ahead-Variante akzeptiert haben, verstehe ich nicht, warum Sie nicht einfach re.split ("\ n", Text) verwenden; Es scheint, als ob du die Zeilen nicht teilen willst, sondern Linien aus dem Text machen willst. – gregory

Verwandte Themen