Und mit Python geht dies genauso: ein String ist eine Sequenz von Charactern. Diese Sequenz kannst Du vorwärts wie rückwärts durchgehen. So könntest Du beispielsweise Dein Wort suchen und dann von dieser Position zurück gehen, bis Du einen Punkt '.' findest. Das ist das Ende des vorhergehenden Satzes. Danach beginnt der Anfang des aktuellen Satzes. Du brauchst also nur die Anfangs- und Endposition des Satzes im String finden und diesen Satz dann extrahieren. Das lässt sich mit oder ohne reguläre Ausdrücke umsetzen. Dir als Anfänger würde ich empfehlen von regulären Ausdrücken abzusehen; mach es ohne - das ist auch eine gute Übung.harvey186 hat geschrieben:Ich suche eine Möglichkeit, dass der ganze Satz, in dem meine Suchwort steht, ausgegeben wir.
...
Bei anderen Programmier sprachen kann man String vorwärts oder rückwärts lesen.
String in Text suchen und Satz ausgeben
@harvey186: was meinst Du mit "bei anderen Programmiersprachen kann man String vorwärts und rückwärts lesen."? Die Kunst beim Programmieren ist es, sein Problem so zu formulieren, dass es der Computer versteht. Und beim Problem "finde alle Sätze mit einem bestimmten Wort" verschweigst Du den ersten Punkt: "lese eine Datei ein und spalte sie in Sätze auf". Was Du Programmiert hast, ist aber "lese eine Datei zeilenweise ein und spalte die Zeilen in Sätze auf und schreibe das ganze ein eine neue Datei mit einem seltsamen Format, das für jegliche Weiterverarbeitung ungeeignet ist." Das ist zwar etwas ähnliches, aber Du hast etwas zusammengeschrieben, das Du nicht wirklich verstehst, was an sich nicht schlimm ist, aber jetzt müßte der nächste Schritt kommen, nämlich versuchen das was Du geschrieben hast zu verstehen und das, was schon paßt, zu behalten und das was nicht paßt so zu ändern, dass es passend wird. Was macht z.B. die Zeile `txt1 = str(line.split("."))` genau und was hast Du Dir gedacht, als Du sie geschrieben hast?
@kbr. Ja genauso würde ich das gerne machen, aber ich habe keine Ahnung wie man in Python einen String rückwärts durchsucht.
mit pattern = r'\bLuzifer\b[^.,;:!?]{2,}' wird "Luzifer" gesucht und bis zum nächsten Punkt gespeichert.
Und wie finde ich nun dann Punkt vor "Luzifer" ?? Dafür habe halt noch keinen Befehl gefunden.
@Sirius
Das ist ja mein Problem, ich weiß nicht, wie ich Spalte ich die Datei in Sätze auf und nicht in Absätze so wie bei mir. Ich habe schon diverses mit split und linesplit und read und readlines probiert, aber a´nichts führt zum gewünschten Ergebnis. Daher kommt auch die Zeile `txt1 = str(line.split("."))`Damit möchte ich bis zum nächsten Punkt splitten.
mit pattern = r'\bLuzifer\b[^.,;:!?]{2,}' wird "Luzifer" gesucht und bis zum nächsten Punkt gespeichert.
Und wie finde ich nun dann Punkt vor "Luzifer" ?? Dafür habe halt noch keinen Befehl gefunden.
@Sirius
Das ist ja mein Problem, ich weiß nicht, wie ich Spalte ich die Datei in Sätze auf und nicht in Absätze so wie bei mir. Ich habe schon diverses mit split und linesplit und read und readlines probiert, aber a´nichts führt zum gewünschten Ergebnis. Daher kommt auch die Zeile `txt1 = str(line.split("."))`Damit möchte ich bis zum nächsten Punkt splitten.
@harvey186: wild herumraten ohne zu verstehen, führt eben nicht weiter. Also stelle ich mal konkretere Fragen: Was steht in line? Was macht .split und was str? Und was bedeutet das dann für diese Zeile?
Beim regulären Ausdruck stellst Du die falsche Frage. Rückwärts Durchsuchen geht nicht mit regulären Ausdrücken. Aber mit einer einfachen Umformulierung des Problems wird die Lösung offensichtlich. Spalte mal Deinen regulären Ausdruck auf und erkläre die einzelnen Teile und warum Du sie so geschrieben hast.
Beim regulären Ausdruck stellst Du die falsche Frage. Rückwärts Durchsuchen geht nicht mit regulären Ausdrücken. Aber mit einer einfachen Umformulierung des Problems wird die Lösung offensichtlich. Spalte mal Deinen regulären Ausdruck auf und erkläre die einzelnen Teile und warum Du sie so geschrieben hast.
@harvey186: wie ich schon schrieb: vermeide erst einmal reguläre Ausdrücke. Beginn mit dem von Sirius3 genannten Schritt "lese eine Datei ein und spalte sie in Sätze auf". Sobald Dir das gelungen ist hast Du eine Liste von Sätzen. Dann kannst Du in diesen Sätzen nach dem gewünschten Wort suchen. Hast Du das Wort gefunden, so kennst Du auch den kompletten Satz.
Und zu "Was macht .split --> soll den Absatz in Sätze löschen": Die Frage war nicht, was diese Anweisung machen soll, sondern was sie tatsächlich tut. Was bewirkt sie denn? Probiere es doch einfach mal aus.
Und zu "Was macht .split --> soll den Absatz in Sätze löschen": Die Frage war nicht, was diese Anweisung machen soll, sondern was sie tatsächlich tut. Was bewirkt sie denn? Probiere es doch einfach mal aus.
@harvey186:
Was steht in line? --> Da es sich um eine Schleifenvariable handelt bekommt line den Wert jeder Zeile = Absatz der Eingabedatei.
Was macht .split --> "soll" ist schonmal ein schlechtes Verb. Ein Computer macht etwas, ob er soll oder nicht. .split teilt einen String an einem bestimmten Teilstring (hier ".") auf. Das Ergebnis ist eine Liste mit Strings = Sätze
und was str? --> Es wandelt die Liste in eine für Debugzwecke geeigneten String um.
Und was ist jetzt der Sinn dieser Zeile? Warum hast Du sie geschrieben?
Was steht in line? --> Da es sich um eine Schleifenvariable handelt bekommt line den Wert jeder Zeile = Absatz der Eingabedatei.
Was macht .split --> "soll" ist schonmal ein schlechtes Verb. Ein Computer macht etwas, ob er soll oder nicht. .split teilt einen String an einem bestimmten Teilstring (hier ".") auf. Das Ergebnis ist eine Liste mit Strings = Sätze
und was str? --> Es wandelt die Liste in eine für Debugzwecke geeigneten String um.
Und was ist jetzt der Sinn dieser Zeile? Warum hast Du sie geschrieben?
@kbr
Beginn mit dem von Sirius3 genannten Schritt "lese eine Datei ein und spalte sie in Sätze auf".
Genau das ist ja mein Problem, Das bekomme ich nicht hin !!!!!!
Und zu "Was macht .split --> soll den Absatz in Sätze löschen": Sorry, war natürlich ein Tippfehler. sollte nicht löschen, sondern splitten heißen.
Beginn mit dem von Sirius3 genannten Schritt "lese eine Datei ein und spalte sie in Sätze auf".
Genau das ist ja mein Problem, Das bekomme ich nicht hin !!!!!!
Und zu "Was macht .split --> soll den Absatz in Sätze löschen": Sorry, war natürlich ein Tippfehler. sollte nicht löschen, sondern splitten heißen.
@harvey186: In anderen Sprachen würde man das Problem genau so angehen: Es in kleinere Teilprobleme aufteilen und die lösen. Und was Du mit „bei anderen Programmiersprachen kann man String vorwärts und rückwärts lesen“ meinst ist mir auch nicht wirklich klar. Python's Zeichenkettentyp unterscheiden sich in den Operationen und Zugriffsmöglichkeiten nicht wesentlich von denen anderer gängiger Programmiersprachen.
Wie sähe das denn in einer Programmiersprache aus in der das so geht wie Du Dir vorstellst?
Beide Ansätze, sowohl der mit dem regulären Ausdruck als auch das Aufteilen in Sätze sind ja fast vollständig und können relativ einfach so erweitert werden, das die das tun was sie sollen. Das Wissen das man dazu braucht, ist aber auch nötig um das zu schreiben was Du bereits hast, also müsstest Du bereits wissen wie es geht, oder es stellt sich die Frage wie Du auf das Vorhandene gekommen bist.
Wie sähe das denn in einer Programmiersprache aus in der das so geht wie Du Dir vorstellst?
Beide Ansätze, sowohl der mit dem regulären Ausdruck als auch das Aufteilen in Sätze sind ja fast vollständig und können relativ einfach so erweitert werden, das die das tun was sie sollen. Das Wissen das man dazu braucht, ist aber auch nötig um das zu schreiben was Du bereits hast, also müsstest Du bereits wissen wie es geht, oder es stellt sich die Frage wie Du auf das Vorhandene gekommen bist.
Hm, das mit dem anpassen des regulären Ausdrucks nehme ich zurück. Ich hab's nicht hinbekommen den einfach zu erweitern, so das wirklich alle Fälle abgedeckt sind und das trotzdem noch kompakt und lesbar bleibt.
Komplett ohne reguläre Ausdrücke könnte man es in C# (weil das in anderen Sprachen ja geht, nur in Python nicht) so machen:
[codebox=csharp file=Unbenannt.cs]using System;
using System.Collections.Generic;
using System.IO;
class ForumMain {
private static string EndOfSentence = ".";
private static IEnumerable<String> ParagraphToSentences(string paragraph)
{
foreach (string sentence in paragraph.Split(EndOfSentence.ToCharArray())) {
string trimmedSentence = sentence.Trim();
if (trimmedSentence.Length != 0) {
yield return trimmedSentence + EndOfSentence;
}
}
}
private static IEnumerable<String> ParagraphsToSentences(IEnumerable<String> paragraphs)
{
foreach (string paragraph in paragraphs) {
foreach (string sentence in ParagraphToSentences(paragraph)) {
yield return sentence;
}
}
}
private static bool IsWordBoundary(char c)
{
return Char.IsWhiteSpace(c) || !Char.IsLetter(c);
}
private static bool ContainsWord(string sentence, string word)
{
int startIndex = sentence.IndexOf(word);
if (startIndex == -1) {
return false;
}
int endIndex = startIndex + word.Length;
return (startIndex == 0
|| IsWordBoundary(sentence[startIndex - 1]))
&& (endIndex == sentence.Length - 1
|| IsWordBoundary(sentence[endIndex]));
}
private static IEnumerable<String> SearchForWord(IEnumerable<String> sentences, string word)
{
foreach (string sentence in sentences) {
if (ContainsWord(sentence, word)) {
yield return sentence;
}
}
}
public static void Main(string[] args) {
if (args.Length < 2) {
Console.WriteLine("usage: search.exe <filename> <word>");
} else {
string filename = args[0];
string word = args[1];
IEnumerable<String> paragraphs = File.ReadAllLines(filename);
IEnumerable<String> sentences = ParagraphsToSentences(paragraphs);
IEnumerable<String> filteredSentences = SearchForWord(sentences, word);
foreach (string sentence in filteredSentences) {
Console.WriteLine(sentence);
}
}
}
}[/code]
Man sieht schön wie man so ein Problem auf kleinere Teilprobleme herunter bricht, die man dann mit wenigen Zeilen Code Lösen kann. Testlauf:
[codebox=text file=Unbenannt.txt]./forum.exe tale.txt Luzifer
Dort trifft er auf seinen Boss Luzifer, den Richter.
Pearly ersucht Luzifer um die Genehmigung, ausnahmsweise Zugang zu einer Adresse außerhalb der Stadt zu bekommen: zu Beverlys Haus am See; der hohe Richter Luzifer lehnt Pearlys Antrag ab.
Pearly hat mit Luzifer einen Deal ausgehandelt: Wenn er bereit sei, sich sterblich zu machen, dürfe er Peter auch außerhalb der Stadt verfolgen.[/code]
*Mit* regulären Ausdrücken würde ich die Grundstruktur beibehalten: Aufteilen in Sätze und Suchen nach Wort getrennt implementieren. Das sollte sowohl einfach, als auch lesbar sein/bleiben und man könnte relativ einfach mehr als den Punkt als Satzende verwenden. Der Beispieltext hat allerdings nur Punkte als Satzenden.
Komplett ohne reguläre Ausdrücke könnte man es in C# (weil das in anderen Sprachen ja geht, nur in Python nicht) so machen:
[codebox=csharp file=Unbenannt.cs]using System;
using System.Collections.Generic;
using System.IO;
class ForumMain {
private static string EndOfSentence = ".";
private static IEnumerable<String> ParagraphToSentences(string paragraph)
{
foreach (string sentence in paragraph.Split(EndOfSentence.ToCharArray())) {
string trimmedSentence = sentence.Trim();
if (trimmedSentence.Length != 0) {
yield return trimmedSentence + EndOfSentence;
}
}
}
private static IEnumerable<String> ParagraphsToSentences(IEnumerable<String> paragraphs)
{
foreach (string paragraph in paragraphs) {
foreach (string sentence in ParagraphToSentences(paragraph)) {
yield return sentence;
}
}
}
private static bool IsWordBoundary(char c)
{
return Char.IsWhiteSpace(c) || !Char.IsLetter(c);
}
private static bool ContainsWord(string sentence, string word)
{
int startIndex = sentence.IndexOf(word);
if (startIndex == -1) {
return false;
}
int endIndex = startIndex + word.Length;
return (startIndex == 0
|| IsWordBoundary(sentence[startIndex - 1]))
&& (endIndex == sentence.Length - 1
|| IsWordBoundary(sentence[endIndex]));
}
private static IEnumerable<String> SearchForWord(IEnumerable<String> sentences, string word)
{
foreach (string sentence in sentences) {
if (ContainsWord(sentence, word)) {
yield return sentence;
}
}
}
public static void Main(string[] args) {
if (args.Length < 2) {
Console.WriteLine("usage: search.exe <filename> <word>");
} else {
string filename = args[0];
string word = args[1];
IEnumerable<String> paragraphs = File.ReadAllLines(filename);
IEnumerable<String> sentences = ParagraphsToSentences(paragraphs);
IEnumerable<String> filteredSentences = SearchForWord(sentences, word);
foreach (string sentence in filteredSentences) {
Console.WriteLine(sentence);
}
}
}
}[/code]
Man sieht schön wie man so ein Problem auf kleinere Teilprobleme herunter bricht, die man dann mit wenigen Zeilen Code Lösen kann. Testlauf:
[codebox=text file=Unbenannt.txt]./forum.exe tale.txt Luzifer
Dort trifft er auf seinen Boss Luzifer, den Richter.
Pearly ersucht Luzifer um die Genehmigung, ausnahmsweise Zugang zu einer Adresse außerhalb der Stadt zu bekommen: zu Beverlys Haus am See; der hohe Richter Luzifer lehnt Pearlys Antrag ab.
Pearly hat mit Luzifer einen Deal ausgehandelt: Wenn er bereit sei, sich sterblich zu machen, dürfe er Peter auch außerhalb der Stadt verfolgen.[/code]
*Mit* regulären Ausdrücken würde ich die Grundstruktur beibehalten: Aufteilen in Sätze und Suchen nach Wort getrennt implementieren. Das sollte sowohl einfach, als auch lesbar sein/bleiben und man könnte relativ einfach mehr als den Punkt als Satzende verwenden. Der Beispieltext hat allerdings nur Punkte als Satzenden.
@BlackJack
Danke für die Mühe.
Aber ich glaube ich komme hier nicht weiter, denn eure Erklärungen verstehe ich genauso wenig wie Python selbst. Ich muss wohl noch ein paar Wochen Frust investieren, bis ich weiß, wie ich den Text Satzweise trennen und wegschreiben kann. Wie gesagt, Absatzweise gehts ja, aber nicht Satzweise
Danke für die Mühe.
Aber ich glaube ich komme hier nicht weiter, denn eure Erklärungen verstehe ich genauso wenig wie Python selbst. Ich muss wohl noch ein paar Wochen Frust investieren, bis ich weiß, wie ich den Text Satzweise trennen und wegschreiben kann. Wie gesagt, Absatzweise gehts ja, aber nicht Satzweise

@harvey186: Das hat nicht wirklich etwas mit Python speziell zu tun, denn das Vorgehen ist in so ziemlich allen gängigen Programmiersprachen gleich. Wie man an dem C#-Programm weiter oben sehen kann. Wie gesagt: Das ganze in kleinere Teilprobleme aufteilen. Du musst nicht lösen wie man den Text Satzweise wegschreiben kann, sondern wie man den Text in Absätze aufteilt (1 Funktion), einen Absatz in Sätze aufteilt (1 Funktion), Absätze in Sätze umwandelt (1 Funktion die trivial ist wenn man das Teilproblem *einen* Absatz in Sätze aufteilen gelöst hat), Sätze wegschreiben (1 Funktion, die auch wieder trivial ist, weil man die Sätze da ja schon hat). Das zusammen ergibt dann „Absätze einlesen und Sätze wegschreiben.“
Wobei das mit dem Sätze wegschreiben vom Ursprungsproblem abweicht, das war ja noch ein Wort in Satz suchen. Was auch wieder eine einzelne Funktion ist, denn die Zerlegung der Sätze hat man davor ja schon mittels der anderen Funktionen gelöst. Und auch diese Funktion stützt sich gegebenenfalls auf eine oder mehrere andere Funktionen ab, die Teilprobleme davon lösen.
Als allererstes musst Du den Umgang mit den Kontrollstrukturen (Schleifen, bedingte Ausführung, …), Grunddatentypen (Zahlen, Zeichenketten, Listen, …), und Funktionen (also wie man dies selbst schreibt) lernen. Das ist in Python so, wäre aber auch in jeder anderen Programmiersprache so. Wenn man die grundlegenden Werkzeuge und Spracheigenschaften nicht kennt und beherrscht, kann man sie halt auch nicht anwenden um Probleme zu lösen. Dazu sollte man eigentlich nicht „ein paar Wochen“ brauchen. Ein paar Tage sollten da reichen. Und ob man das mit Frust macht, bleibt jedem selbst überlassen, aber es ist sicher nicht die beste, produktivste Stimmung um etwas zu lernen.
Wobei das mit dem Sätze wegschreiben vom Ursprungsproblem abweicht, das war ja noch ein Wort in Satz suchen. Was auch wieder eine einzelne Funktion ist, denn die Zerlegung der Sätze hat man davor ja schon mittels der anderen Funktionen gelöst. Und auch diese Funktion stützt sich gegebenenfalls auf eine oder mehrere andere Funktionen ab, die Teilprobleme davon lösen.
Als allererstes musst Du den Umgang mit den Kontrollstrukturen (Schleifen, bedingte Ausführung, …), Grunddatentypen (Zahlen, Zeichenketten, Listen, …), und Funktionen (also wie man dies selbst schreibt) lernen. Das ist in Python so, wäre aber auch in jeder anderen Programmiersprache so. Wenn man die grundlegenden Werkzeuge und Spracheigenschaften nicht kennt und beherrscht, kann man sie halt auch nicht anwenden um Probleme zu lösen. Dazu sollte man eigentlich nicht „ein paar Wochen“ brauchen. Ein paar Tage sollten da reichen. Und ob man das mit Frust macht, bleibt jedem selbst überlassen, aber es ist sicher nicht die beste, produktivste Stimmung um etwas zu lernen.
Mit rpg würde ich normalerweise sowas schreiben wie
Zeile lesen
wenn Zeile ungleich BLANKS dann
Ausgabe
bzw. in Datei schreiben.
in Python würde ich das so machen wollen, aber es geht halt nicht
Zeile lesen
wenn Zeile ungleich BLANKS dann
Ausgabe
bzw. in Datei schreiben.
in Python würde ich das so machen wollen, aber es geht halt nicht
Code: Alles auswählen
f = open("tale.txt", "r")
fobj_out = open("tale1.txt","w")
line = f.readline()
for line in f:
if line != " ":
ln =
print(line, end="")
fobj_out.write(line)
Zuletzt geändert von Anonymous am Donnerstag 15. Dezember 2016, 13:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@harvey186: Python ist halt nicht RPG, so wie so ziemlich jede andere Programmiersprache nicht RPG ist. Zumal ich jetzt nicht sehe wie das Programm welches Du da in Pseudocode für RPG skizziert hast Dein Problem aus dem Ausgangsbeitrag löst. Das scheint mir nur nicht-leere Zeilen auszugeben beziehungsweise zu kopieren.
Das macht Dein Python-Programm ja auch fast, wenn man drei kleine Änderungen vornimmt. 1. Nicht vor der Schleife die erste Zeile der Datei lesen und dann nichts damit tun (es sei denn das war Absicht das die erste Zeile der Eingabedatei ignoriert wird). 2. Den Syntaxfehler mit der Zuweisung an `ln` beseitigen wo auf der rechten Seite nichts steht. 3. Der Test den Du machst ist ob `line` ungleich der Zeichenkette mit einem Leerzeichen ist. Das ist nicht das was Du willst. Da gibt es zwei Möglichkeiten das zu lösen wenn man sich mal die Methoden anschaut die auf Zeichenketten in Python definiert sind. Bei einer der Lösungen muss man noch wissen wie Python den Wahrheitsgehalt eines Wertes bei Bedingungen bestimmt.
Das sind alles Grundlagen. Die muss man lernen wenn man in Python programmieren möchte. Wie bei jeder anderen Programmiersprache auch. Das müsste ich bei RPG auch wenn ich damit diese Aufgabe lösen wollte. Da kann ich mich auch nicht hinstellen und ein bisschen im Netz suchen und ein paar Sachen ausprobieren und dann sagen, och in Python geht das aber, RPG frustriert mich. Da muss ich ja wochenlang frustriert lernen bevor ich das lösen kann.
Das macht Dein Python-Programm ja auch fast, wenn man drei kleine Änderungen vornimmt. 1. Nicht vor der Schleife die erste Zeile der Datei lesen und dann nichts damit tun (es sei denn das war Absicht das die erste Zeile der Eingabedatei ignoriert wird). 2. Den Syntaxfehler mit der Zuweisung an `ln` beseitigen wo auf der rechten Seite nichts steht. 3. Der Test den Du machst ist ob `line` ungleich der Zeichenkette mit einem Leerzeichen ist. Das ist nicht das was Du willst. Da gibt es zwei Möglichkeiten das zu lösen wenn man sich mal die Methoden anschaut die auf Zeichenketten in Python definiert sind. Bei einer der Lösungen muss man noch wissen wie Python den Wahrheitsgehalt eines Wertes bei Bedingungen bestimmt.
Das sind alles Grundlagen. Die muss man lernen wenn man in Python programmieren möchte. Wie bei jeder anderen Programmiersprache auch. Das müsste ich bei RPG auch wenn ich damit diese Aufgabe lösen wollte. Da kann ich mich auch nicht hinstellen und ein bisschen im Netz suchen und ein paar Sachen ausprobieren und dann sagen, och in Python geht das aber, RPG frustriert mich. Da muss ich ja wochenlang frustriert lernen bevor ich das lösen kann.
Ich habe damit nur das angedeutet, was hier immer wider gesagt wird: Kleine Schritte.
Die Leerzeile weg nehmen wäre Schritt eins gewesen, aber schon daran scheitere ich.
Gibt es eigentlich irgendwo eine Befehlsübersicht,
wo ich mir die Befehle anschauen kann und welche Parameter sie brauchen ?
also z.B. Datei ganz einlesen --- read() -- Parameter blah blah
Zeilenweise lesen readline () -- Parameter blah blah bla
Datei öffnen --- open () --Parameter blah, blah
u.s.w.
hab ledier nichts per Google gefunden
Die Leerzeile weg nehmen wäre Schritt eins gewesen, aber schon daran scheitere ich.
Gibt es eigentlich irgendwo eine Befehlsübersicht,
wo ich mir die Befehle anschauen kann und welche Parameter sie brauchen ?
also z.B. Datei ganz einlesen --- read() -- Parameter blah blah
Zeilenweise lesen readline () -- Parameter blah blah bla
Datei öffnen --- open () --Parameter blah, blah
u.s.w.
hab ledier nichts per Google gefunden
@harvey186: Das steht alles in der Python-Dokumentation. Die gibt's da wo Python her kommt: python.org
Wobei ich es jetzt nicht Befehlsübersicht nennen würde, denn Befehle sind was anderes und davon gibt's in Python nicht wirklich viele. Aber auch die sind natürlich in der Dokumentation zu finden.
Wobei ich es jetzt nicht Befehlsübersicht nennen würde, denn Befehle sind was anderes und davon gibt's in Python nicht wirklich viele. Aber auch die sind natürlich in der Dokumentation zu finden.
Was wird eigentlich aus Sätzen, die Punkte enthalten, welche kein Satzende kennzeichnen? Beispiele:
Ich denke, für diese Fälle muss man einfach hinnehmen, dass eine rein syntaktische Analyse hier an ihre Grenzen stößt. Man sieht aber, wie komplex das Ganze werden kann, wenn man alle Feinheiten der Sprache beachten möchte.Er ließ sich lieber von Dr. Schmidt untersuchen.
Wir haben viel Obst, z.B. Äpfel, Bananen und Birnen.
Das 3. Buch Mose.
@snafu: Schwierig. Insbesondere weil bei einigen Abkürzungen der Punkt gleichzeitig auch das Ende des Satzes sein kann. Wie bei ”usw.” wenn es am Satzende steht. Und auch tatsächliche Satzende-Punkte können problematisch sein wenn sie in zitiertem, gesprochenen Wort stehen. Um es mit Homer S.' oder (S'.?) Worten zu sagen: „Doh.“ Da ist ein Punkt für das Satzende *nach dem* noch ein Anführungszeichen kommt, welches nicht zum nächsten Satz gehört. Und ein Fragezeichen im Satz das nicht den Satz beendet. Und was ist mit meinem Lieblingssatzzeichen‽ ← Ja genau das da.
Oder die Spanier stellen Satzzeichen ja auch manchmal voran und/oder auf den Kopf (¿Que?). Die […] Auslassungpunkte können auch mitten drin oder am Ende stehen… Über Programmiersprachen darf man auch nicht schreiben. Python geht ja noch, aber Negation (!) oder der Ternärer Operator ((cond) ? iftrue : iffalse;) in Sprachen die an C-Syntax angelehnt sind, bereiten Probleme. Natürliche Sprachen sind lustig. 


Hier mal ein erster naiver Ansatz, um Sätze zu trennen:
Das finde ich noch halbwegs lesbar trotz regulären Ausdrücken: Trenne an Leerzeichen, wenn diesen ein Punkt, Ausrufezeichen oder Fragezeichen vorangestellt ist. Wenn man noch wörtliche Rede reinbringen will, dann wird es schon komplizierter. Aber auf dieser Basis müsste man nur noch das Ergebnis durchgehen und schauen, in welchen Sätzen das Suchwort enthalten ist. Was natürlich noch nicht bedacht wurde, sind mehrzeilige Texte, wo ein Satz natürlich auch einen Zeilentrenner enthalten kann.
Code: Alles auswählen
import re
def main():
text = 'Der Hase liegt im Gras. Das Kind schaut ihm dabei zu. Aber plötzlich passiert es: Der Hase hoppelt davon!'
sentences = re.split(r"(?<=[.!?]) ", text)
print('\n'.join(sentences))
if __name__ == '__main__':
main()