Textwrap mit Backslash

11/11/2013 - 12:05 von ole-usenet-spam | Report spam
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"
script += "my-prog"
for i in range(1, 10):
script += " --file{0}=/data/raw{0}-left.fits".format(i)

script += "rm -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 "".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
 

Lesen sie die antworten

#1 Stefan Schwarzer
11/11/2013 - 12:36 | Warnen spam
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."""
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
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:
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

Ähnliche fragen