Hallo zusammen,
ich habe folgendes kleines Problem...
Ein Fließtext soll alle 60 Zeichen umgebrochen werden. Grundsätzlich kein Problem. Ich würde nun aber gerne prüfen, ob an der Stelle 60 ein Umbruch "sinnvoll" möglich ist, sprich nicht mitten im Wort getrennt wird. Mein bisheriger Ansatz sieht vor, zu prüfen, ob das 60. Zeichen ein Leerzeichen ist. Wenn dies nicht der Fall ist, prüfe ich das 59. usw. bis ich ein Leerzeichen finde und setze an dieser Stelle ein "\n" ein. Meine Frage ist nun, ob jemandem eine etwas elegantere Lösung einfällt..?
Vielen Dank für Eure Hilfe!
Zeilenumbruchsprüfung in Fließtext
Ich würde das konstruktiv lösen: Starte mit einer leeren Zeile, füge dann so lange (durch Leerzeichen getrennte) Wörter zu einer Zeile hinzu, wie es passt. Andernfalls füge das Wort zur nächsten Zeile hinzu. Das kann dann so aussehen:
Mein Algorithmus berücksichtigt nicht den Randfall, dass ein Wort breiter ist als die maximale Breite. Das überlasse ich dem Leser.
Stefan
Code: Alles auswählen
s = r'Ein Fließtext soll alle 60 Zeichen umgebrochen werden. Grundsätzlich kein Problem. Ich würde nun aber gerne prüfen, ob an der Stelle 60 ein Umbruch "sinnvoll" möglich ist, sprich nicht mitten im Wort getrennt wird. Mein bisheriger Ansatz sieht vor, zu prüfen, ob das 60. Zeichen ein Leerzeichen ist. Wenn dies nicht der Fall ist, prüfe ich das 59. usw. bis ich ein Leerzeichen finde und setze an dieser Stelle ein "\n" ein. Meine Frage ist nun, ob jemandem eine etwas elegantere Lösung einfällt..?'
import re
def wrap(s, w=60):
lines = []
line1 = ""
for word in re.findall(r"\S+", s):
line2 = line1 + " " + word if line1 else word
if len(line2) > w:
lines.append(line1)
line1 = word
else:
line1 = line2
lines.append(line1)
return "\n".join(lines)
print(wrap(s, 30))
Stefan
@DaFe4U: Das `textwrap`-Modul in der Standardbibliothek ist bekannt!?
Edit:
Edit:
Code: Alles auswählen
In [62]: print textwrap.fill(s, 60)
Ein Fließtext soll alle 60 Zeichen umgebrochen werden.
Grundsätzlich kein Problem. Ich würde nun aber gerne prüfen,
ob an der Stelle 60 ein Umbruch "sinnvoll" möglich ist,
sprich nicht mitten im Wort getrennt wird. Mein bisheriger
Ansatz sieht vor, zu prüfen, ob das 60. Zeichen ein
Leerzeichen ist. Wenn dies nicht der Fall ist, prüfe ich das
59. usw. bis ich ein Leerzeichen finde und setze an dieser
Stelle ein "\n" ein. Meine Frage ist nun, ob jemandem eine
etwas elegantere Lösung einfällt..?
In [63]: print textwrap.fill(s, 30)
Ein Fließtext soll alle 60
Zeichen umgebrochen werden.
Grundsätzlich kein Problem.
Ich würde nun aber gerne
prüfen, ob an der Stelle 60
ein Umbruch "sinnvoll" möglich
ist, sprich nicht mitten im
Wort getrennt wird. Mein
bisheriger Ansatz sieht vor,
zu prüfen, ob das 60. Zeichen
ein Leerzeichen ist. Wenn dies
nicht der Fall ist, prüfe ich
das 59. usw. bis ich ein
Leerzeichen finde und setze an
dieser Stelle ein "\n" ein.
Meine Frage ist nun, ob
jemandem eine etwas elegantere
Lösung einfällt..?
Dem schließe ich mich mal an und komme unter der Prämisse dann zu einer sehr übersichtlichen Lösung:sma hat geschrieben:Mein Algorithmus berücksichtigt nicht den Randfall, dass ein Wort breiter ist als die maximale Breite. Das überlasse ich dem Leser.
Code: Alles auswählen
def wrap(s, w=60):
lines = re.findall('(.{0,' + str(w) + '})(?:\\s|\\Z)', s)
return "\n".join(lines)
Zuletzt geändert von /me am Montag 25. Oktober 2010, 11:49, insgesamt 1-mal geändert.
the more they change the more they stay the same
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
ReportLab hat diverse Funktion zum Textumbruch, von dumm bis intelligent, von Lateinischer Schrift (wie z.B. Deutsch) bis Japanisch.
Ob man das hier braucht weiß ich nicht.
Gruß, noisefloor
ReportLab hat diverse Funktion zum Textumbruch, von dumm bis intelligent, von Lateinischer Schrift (wie z.B. Deutsch) bis Japanisch.
Ob man das hier braucht weiß ich nicht.
Gruß, noisefloor