\n und \t ersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

ich habe eine Liste mit Zeichen, die durch Nichts ersetzt werden sollen

Code: Alles auswählen

replace_list = cp.get(section, "replace")
# replace_list = \t, ,\n,\r,\r\n

replace_list = replace_list.split(",")
#replace_list = ['\\t', ' ', '\\n', '\\r', '\\r\\n']

s = "                   " # string mit \n und \t
for r in replace_list:
    s = s.replace(r, "")
Warum werden \n und \t nicht ersetzt?

Wie kann ich diese Zeichen ersetzen?

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

In deiner `replace_list` steht ["\\n", ...]. Das stellt keinen Zeilenumbruch (\n) dar, sondern "Backslash + n" (\\n).
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

gibt es eine Möglichkeit, dass \+n als \n interpretiert wird?
Oder kann ich den ConfigParser irgendwie sagen, dass er aus \+n ein \n macht?

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Code: Alles auswählen

print r"komischer\nstring\nhier".decode("string-escape")
(Nur in python 2.x)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Er meinte es andersrum, glaube ich. `string.replace("\\n", "\n")`.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@Dauersbaustelle:
Meinst du mich? Da ist ein Raw-String im Code-beispiel, lass dich nicht vom Highlighting verarschen ;)
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

in einer config.ini steht folgendes

Code: Alles auswählen

[section]
...
replace = \t, ,\n,\r,\r\n
...
die Datei config.ini lese ich mit den ConfigParser ein und hole mir den Wert von replace mit get

Bei ein String möchte ich dann alle Vorkommen durch Nichts ersetzen.

D.h. ist bei replace ein \t und \n angegeben und enthält der String diese Zeichen, sollen diese mit "" ersetzt werden.

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,
b.esser-wisser hat geschrieben:

Code: Alles auswählen

print r"komischer\nstring\nhier".decode("string-escape")
(Nur in python 2.x)
wie geht das in python3 bzw. python3.1?

mit ".decode("string-escape")" funktioniert das Ersetzen unter python2.6

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

Funktioniert "unicode-escape" als Argument für str.decode()? -- ich hab kein Python 3 und google spuckt da kaum was nützliches aus (was du wahrscheinich gemerkt hast ;)).
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

@b.esser-wisser:
In Python 3 gibt es gar kein str.decode()

@Twilo:
Es funktioniert nicht weil es str.decode() in Python 3 nicht gibt.
/edit: Übrigens muss bei Python 3 »print« wie eine Funktion aufgerufen werden.

Beispiel:

Code: Alles auswählen

print("Hallo Welt!")
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,
b.esser-wisser hat geschrieben:Funktioniert "unicode-escape" als Argument für str.decode()? -- ich hab kein Python 3 und google spuckt da kaum was nützliches aus (was du wahrscheinich gemerkt hast ;)).
die Methode "decode" gibt es nicht

Ausgabe von dir()
__add__
__class__
__contains__
__delattr__
__doc__
__eq__
__format__
__ge__
__getattribute__
__getitem__
__getnewargs__
__gt__
__hash__
__init__
__iter__
__le__
__len__
__lt__
__mod__
__mul__
__ne__
__new__
__reduce__
__reduce_ex__
__repr__
__rmod__
__rmul__
__setattr__
__sizeof__
__str__
__subclasshook__
_formatter_field_name_split
_formatter_parser
capitalize
center
count
encode
endswith
expandtabs
find
format
index
isalnum
isalpha
isdecimal
isdigit
isidentifier
islower
isnumeric
isprintable
isspace
istitle
isupper
join
ljust
lower
lstrip
maketrans
partition
replace
rfind
rindex
rjust
rpartition
rsplit
rstrip
split
splitlines
startswith
strip
swapcase
title
translate
upper
zfill

mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

nomnom hat geschrieben:In Python 3 gibt es gar kein str.decode()
Argh, weiß ich doch - ich meinte natürlich bytes.decode() ;)
also, wenn ConfigParser str() zurückliefert weiß ich auch nicht weiter, d.h. mach's von Hand (str.replace, re o.ä.).
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn nur `bytes` eine `decode`-Methode hat, muss man halt den String zunächst in ein `bytes`-Objekt verwandeln:

Code: Alles auswählen

s = r"\n\t"
print(len(s)) # 4
s = bytes(s, "ascii", "ignore").decode("unicode-escape")
print(len(s)) # 2
Problem hierbei: Zeichen außerhalb von ASCII überleben das nicht. Man kann ISO_8859_1 statt ASCII als Encoding benutzen und so jedenfalls Umlaute und andere Westeuropäische Sonderzeichen retten, doch leider sehe ich keine Möglichkeit, wie man Zeichen mit einem Codepunkt > 255 sicher da durchschleusen kann. Diese müssten im Vorfeld als `\uXXXX` kodiert worden sein.

Daher würde ich lieber empfehlen, `unicode-escape` zu ignorieren und die beiden Zeichen per Hand zu ersetzen:

Code: Alles auswählen

s = s.replace("\\n", "\n").replace("\\t", "\t")
Stefan
Antworten