Hallo Gruppe, wie kann ich einen Text automatisch so umbrechen, dass die umgebrochenen Zeilen mit einem "\" gekennzeichnet sind? Ich möchte gerne für eine Dokumentation ein Shellscript generieren, welches dann in die Dokumentation eingefügt werden kann, und zwar ohne dass überlange Zeilen entstehen. z.B. ---------------8<----------------------- import textwrap # Create sample script script = "!/bin/sh\n" script += "\nmy-prog" for i in range(1, 10): script += " --file{0}=/data/raw{0}-left.fits".format(i) script += "\nrm -f" for i in range(1, 10): script += " /data/raw{0}-left.fits".format(i) # Reformat sample script so that it fits to the textbox print "\n".join(textwrap.wrap(script, subsequent_indent = " ", replace_whitespace = False, drop_whitespace = False, break_long_words = False, break_on_hyphens = False)) ---------------8<----------------------- Das Problem sind hier die fehlenden Backslashes am Ende der fortgesetzten Zeilen. Wie bekomme ich die dahin? Viel Grüße Ole
Hi Ole, On 2013-11-11 12:05, Olе Streicher wrote:
Das Problem sind hier die fehlenden Backslashes am Ende der fortgesetzten Zeilen. Wie bekomme ich die dahin?
ich weiß nicht, ob ich es nicht noch einfacher geht, aber spontan fällt mir `re.sub` mit `MULTILINE`-Flag ein: In [1]: import re In [2]: text = """Dies ist ein ...: mehrzeiliger ...: Text.""" In [7]: print re.sub("$", " \\\\", text, flags=re.MULTILINE) Dies ist ein \ mehrzeiliger \ Text. \ Den Backslash am Ende kannst du folgendermaßen loswerden: In [9]: text2 = re.sub("$", " \\\\", text, flags=re.MULTILINE) In [10]: print text2 Dies ist ein \ mehrzeiliger \ Text. \ In [11]: print re.sub(r"[\s\\]+$", "", text2) Dies ist ein \ mehrzeiliger \ Text. (hier _ohne_ `MULTILINE`-Flag). Was _mich_ jetzt nur noch interessiert, ist, warum ich für den Ersetzungs-String _vier_ Backslashes schreiben muss. Ich hatte es mit zwei Backslashes versucht, aber bakam dann: In [6]: print re.sub("$", " \\", text, flags=re.MULTILINE) --------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-6-25bd5b1b5476> in <module>() ----> 1 print re.sub(r"$", " \\", text, flags=re.MULTILINE) /usr/lib64/python2.7/re.pyc in sub(pattern, repl, string, count, flags) 149 a callable, it's passed the match object and must return 150 a replacement string to be used.""" --> 151 return _compile(pattern, flags).sub(repl, string, count) 152 153 def subn(pattern, repl, string, count=0, flags=0): /usr/lib64/python2.7/re.pyc in _subx(pattern, template) 268 def _subx(pattern, template): 269 # internal: pattern.sub/subn implementation helper --> 270 template = _compile_repl(template, pattern) 271 if not template[0] and len(template[1]) == 1: 272 # literal replacement /usr/lib64/python2.7/re.pyc in _compile_repl(*key) 255 p = sre_parse.parse_template(repl, pattern) 256 except error, v: --> 257 raise error, v # invalid expression 258 if len(_cache_repl) >= _MAXCACHE: 259 _cache_repl.clear() error: bogus escape (end of line) Ich habe auch festgestellt, dass ich statt re.sub("$", " \\\\", text, flags=re.MULTILINE) auch re.sub("$", r" \\", text, flags=re.MULTILINE) schreiben kann. Aber das ist nicht weniger "mysteriös". Viele Grüße Stefan
4 Stück, weil durch Python aus \\\\ ein \\ wird, den die RE dann als \ interpretiert. D.h. für Python muss der Backslash escaped werden, und für die Regular Expression nochmals. In raw Strings fällt das Escaping von Python weg und \\ reicht. HTH, Stefan Stefan Schwarzer <sschwarzer@sschwarzer.net> schrieb:
Hi Ole,
On 2013-11-11 12:05, Olе Streicher wrote:
Das Problem sind hier die fehlenden Backslashes am Ende der fortgesetzten Zeilen. Wie bekomme ich die dahin?
ich weiß nicht, ob ich es nicht noch einfacher geht, aber spontan fällt mir `re.sub` mit `MULTILINE`-Flag ein:
In [1]: import re
In [2]: text = """Dies ist ein ...: mehrzeiliger ...: Text."""
In [7]: print re.sub("$", " \\\\", text, flags=re.MULTILINE) Dies ist ein \ mehrzeiliger \ Text. \
Den Backslash am Ende kannst du folgendermaßen loswerden:
In [9]: text2 = re.sub("$", " \\\\", text, flags=re.MULTILINE)
In [10]: print text2 Dies ist ein \ mehrzeiliger \ Text. \
In [11]: print re.sub(r"[\s\\]+$", "", text2) Dies ist ein \ mehrzeiliger \ Text.
(hier _ohne_ `MULTILINE`-Flag).
Was _mich_ jetzt nur noch interessiert, ist, warum ich für den Ersetzungs-String _vier_ Backslashes schreiben muss. Ich hatte es mit zwei Backslashes versucht, aber bakam dann:
In [6]: print re.sub("$", " \\", text, flags=re.MULTILINE) --------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-6-25bd5b1b5476> in <module>() ----> 1 print re.sub(r"$", " \\", text, flags=re.MULTILINE)
/usr/lib64/python2.7/re.pyc in sub(pattern, repl, string, count, flags) 149 a callable, it's passed the match object and must return 150 a replacement string to be used.""" --> 151 return _compile(pattern, flags).sub(repl, string, count) 152 153 def subn(pattern, repl, string, count=0, flags=0):
/usr/lib64/python2.7/re.pyc in _subx(pattern, template) 268 def _subx(pattern, template): 269 # internal: pattern.sub/subn implementation helper --> 270 template = _compile_repl(template, pattern) 271 if not template[0] and len(template[1]) == 1: 272 # literal replacement
/usr/lib64/python2.7/re.pyc in _compile_repl(*key) 255 p = sre_parse.parse_template(repl, pattern) 256 except error, v: --> 257 raise error, v # invalid expression 258 if len(_cache_repl) >= _MAXCACHE: 259 _cache_repl.clear()
error: bogus escape (end of line)
Ich habe auch festgestellt, dass ich statt
re.sub("$", " \\\\", text, flags=re.MULTILINE)
auch
re.sub("$", r" \\", text, flags=re.MULTILINE)
schreiben kann. Aber das ist nicht weniger "mysteriös".
Viele Grüße Stefan _______________________________________________ python-de maillist - python-de@python.org https://mail.python.org/mailman/listinfo/python-de
-- GPG Key Fingerprint: 74B0 0934 0669 B3FF E3F6 F1AC 32A4 3081 ACDD 5DA3
ole-usenet-spam@gmx.net (Olе Streicher) writes:
wie kann ich einen Text automatisch so umbrechen, dass die umgebrochenen Zeilen mit einem "\" gekennzeichnet sind?
Langes Grübeln hat es gebracht: s = "\n".join("\\\n".join(textwrap.wrap(line, width = 72, subsequent_indent = " " * 4, drop_whitespace = False, replace_whitespace = False, break_long_words = False, break_on_hyphens = False)) for line in s.splitlines()) Zusatzfrage wäre jetzt, wie man ein korrektes Wordwrap für Python-Quellcode (entsprechend PEP) hinbekommt. Gibt es (vielleicht sogar in den mitgelieferten Batterien) einen Quelltext-Beautifier? Viele Grüße Ole
participants (3)
-
Dr. Stefan Pfeiffer -
ole-usenet-spam@gmx.net -
Stefan Schwarzer