2016-07-11 9 views
0

Ich habe viele verwandte Fragen zu meinen gesehen, aber ich kann immer noch nicht scheinen, um mein konkretes Beispiel zu arbeiten. Ich habe einige Daten in einer Datei, die mehrere Sätze aneinandergereiht ist. Ich versuche, die Sätze in eine Liste aufzuteilen, wobei jeder Satz ein Element der Liste ist. Aber wenn ich auf eine Periode splitte, gefolgt von einer Leerstelle, verliere ich die Periode in allen Elementen meiner Liste (außer der letzten). beginne ich mit diesem:Split-on-Periode ohne Entfernen der Periode Interpunktion einmal geteilt - Python

text = "This sentence. And this one. One more." 

gewünschte Ausgabe:

["This sentence.", "And this one.", "One more."] 

Derzeit wird diese von erhalte ich text.split tun (‘„.):

["This sentence","And this one","One more."] 
+0

Sie brauchen Look-Ahead/Lookbehind – rock321987

+0

I versuchte dies re.split (r '\. (? =)', Text), aber ich habe das gleiche Problem – dahlia

Antwort

2

Verwenden positiver Blick hinter:

import re 
re.split(r'(?<=\.) ', text) 

Die oben geht davon aus Ihrem Satz immer mit einem Punkt und ein Leerzeichen am Ende (mit Ausnahme des letzten Satz). (?<=\.) ist ein positiver Blick hinterher, also wird die obige Regexp auf einen Abstand teilen, der direkt hinter einem Punkt ist, aber Punkt wird nicht berücksichtigt, wenn die Teilstrings gemacht werden.

+0

Danke! Das hat für mich funktioniert! – dahlia

+0

Da mein Text biologisch ist, habe ich festgestellt, dass er manchmal auf einen Namen wie "C. elegans" spaltet. Also habe ich mich gefragt, wie ich es nur teilen könnte, wenn es eine Periode gibt, gefolgt von einem Leerzeichen gefolgt von einem Großbuchstaben. Entschuldigung für die Nischenanfrage. Ich habe es versucht: re.split (r '(? <= \.) [A-Z] +', Text) Aber ich bekomme einen Fehler ... Danke! – dahlia

+0

Ich würde nach hinten schauen + vorausschauen, also 're.split (r '(? <= \.) (? = [A-Z]))' –

1

Sie die gespeicherte Given Aufgeteilte Liste in einer Variablen:

strList = text.split() 
for line in strList: 
    line.append('.') 
strList[len(strList) - 1] = strList[len(strList) - 1][:-1] 
+0

Vielen Dank für die Antwort! Ich habe versucht, nach einem einzigen Liner zu suchen, anstatt zurückzugehen und den Zeitraum anzuhängen, aber ich werde das tun, wenn keine anderen Lösungen existieren. Ich bin nur überrascht, dass es absolut keine Möglichkeit gibt, Python zu sagen, das Trennzeichen nicht zu entfernen .... – dahlia

0

Sie könnten Folgendes verwenden und die führenden Leerzeichen beschneiden.

[^\.]+\. 

REGEX demo

0

kann dies auch

[ i.group(0) for i in re.finditer('\S[^\.]+(\.|.$)', text)] 

es alle Zeichen außer Punkt passt getan werden, bis es einen Punkt oder Ende der Zeile erreicht

Verwandte Themen