Seite 1 von 1
Variablen in reaplace
Verfasst: Montag 16. April 2012, 13:17
von strubi
Hallo zusammen
Ich habe eine Suchabfrage die ich öfters gerne verwenden würde. Beispiel:
Code: Alles auswählen
search = search.replace(" ", " ") # Leerzeichen ersetzen
search = search.replace("ä", "ä") # ä ersetzen
search = search.replace("Ä", "Ä") # Ä ersetzen
Wie kann ich nun die Such und Ersetzfunktionen (z.B. " ", " " und "ä", "ä") in eine Variable speichern?
Ich stelle mir das so vor:
Code: Alles auswählen
zeichenersetzen = {
" " : " ",
"ä": "ä",
"Ä", "Ä"
}
search = search.replace(zeichenersetzen)
Aber das funktioniert so nicht...
Ich meine, das müsste relativ einfach sein, stehe aber irgend wie auf dem Schlauch. Habe gesucht und gegooglet wie verrückt aber scheinbar immer die falschen Begriffe benutzt. Habe nichts gefunden
Vielen Dank für die Hilfe
gruss strubi
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 13:22
von BlackJack
@strubi: Das was Du da willst gibt `replace()` einfach nicht her. Du könntest aber die Wertepaare in einer Schleife nacheinander mit `replace()` abarbeiten. Statt eines Wörterbuchs würde ich da übrigens eine Liste mit Wertepaaren empfehlen, denn die Reihenfolge in der eine Ersetzung stattfindet ist nicht immer egal und Wörterbücher sind ungeordnet.
Bei dem speziellen Fall könnte man auch `re.sub()` mit einer Funktion als Ersetzung verwenden, die sich die Werte aus dem `htmlentities`-Modul holt.
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 13:50
von strubi
Ok, gut, wenn das reaplace nicht her gibt bin ein ein wenig getröstet. Das erklährt warum ich im www nichts gefunden habe.
Nun mit re.sub() bin ich auch am pröbeln. Und zwar stellt sich mir da das gleiche Problem. Ich habe eine Abfrage von Reverenzsstellen die immer mal wieder vor kommen. Nun möchte ich diese Referenzsstellen in eine Variable packen und diese dann durchlaufen lassen. Zum besseren Verständniss: Es handelt sich um ein Theologische Lexikon das ich gerne umformatieren möchte, damit ich es in eine andere Software packen kann... Nun kommen da öfters mal Bibelstellen vor die ich irgend wie auslesen und neu formatieren muss. Nun möchte ich z.B. alle Stellen mit einem spezialzeichen markieren (z.B. ein £) um damit die Stellen besser bearbeiten zu können.
Nun habe ich eine Liste mit allen Biblischen Büchern, und die müsste ich dann öfters verwenden können.
Die Liste Siet wie folgt aus:
Nun möchte ich die Stellen mit re.sub neu konfigurieren:
(In der Variable <search> ist das ganze Lexikon enthalten das ich zuvor aus einer Textdatei ausgelesen habe)
Aber so funktioniert das auch nicht....
Die Liste mit den Referenzstellen ist ziemlich lange, und ich benötige sie mehr als einmal. Darum währe es wohl klug, wenn ich die Variable mit den Referenzstellen öfters mal brauchen könnte.
Wie muss ich das angehen?
Danke und gruss
strubi
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 14:08
von BlackJack
@strubi: „So funktioniert das auch nicht” ist keine gute Fehlerbeschreibung. Du wirst wohl einen `TypeError` bekommen, denn Zeichenketten und Listen kann man nicht mit dem ``+``-Operator verbinden. Was die Ausnahme eigentlich auch recht deutlich sagt:
Code: Alles auswählen
In [229]: '' + []
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/bj/<ipython console> in <module>()
TypeError: cannot concatenate 'str' and 'list' objects
Warum steckt in der Liste denn auch nur *ein* Element?
Die eckigen Klammern um das Leerzeichen vor dem '?' im regulären Ausdruck sind übrigens überflüssig.
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 14:09
von Hyperion
Ich verlinke mal den
Ursprungsthread aus uu.de
Ich nehme an, es handelt sich immer noch um dieses Problem?
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 14:25
von strubi
Jaaa snif

ist noch das gleiche Problem...
Aber ich habe es noch ein wenig komplexer gemacht seit daher
Die Sache ist nur die, ich krieg das irgend wie nicht in den Kopf rein, und möchte das Problem lösen! Es geht schlussendlich um das Gefühl, es geschafft zu haben. (Ein gutes Gefühl, wenn es dann soweit ist)
So nun muss ich aber mit den Kindern raus, die rennen mir die Bubde ein!
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 14:40
von BlackJack
@strubi: Es vielleicht nicht so produktiv hier tatsächlich wieder bei 0 anzufangen. Denn das wird dann ja wie dort mit jedem Beitrag wo sich jemand an einem Lösungsansatz versucht wieder komplizierter, weil der eben nicht alles abdeckt.
Ich würde das ja sauber lösen wollen, also mit einem HTML-Parser, zum Beispiel `lxml.html`, und dann einem Parser für die Referenzen, zum Beispiel mit `pyparsing`, und einem eigenen Datentyp für die Referenzen. Das ist Dir aber wahrscheinlich zu viel Arbeit…
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 16:19
von strubi
Ach ich weiss ncht...
lxml.html habe ich angesehen, aber isch schnall dieses Ding nicht. Die Arbeit ist nicht so sehr das Problem, viel mehr die Englischen Dokus die ich nicht all zu gut verstehe...
Gruss
strubi
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 16:55
von problembär
strubi hat geschrieben:Hallo zusammen
Ich habe eine Suchabfrage die ich öfters gerne verwenden würde. Beispiel:
Code: Alles auswählen
search = search.replace(" ", " ") # Leerzeichen ersetzen
search = search.replace("ä", "ä") # ä ersetzen
search = search.replace("Ä", "Ä") # Ä ersetzen
Wie kann ich nun die Such und Ersetzfunktionen (z.B. " ", " " und "ä", "ä") in eine Variable speichern?
Ich stelle mir das so vor:
Code: Alles auswählen
zeichenersetzen = {
" " : " ",
"ä": "ä",
"Ä", "Ä"
}
search = search.replace(zeichenersetzen)
Aber das funktioniert so nicht...
Warum sollte das nicht so gehen (ungetestet)? :
Code: Alles auswählen
zeichenersetzen = {
" " : " ",
"ä": "ä",
"Ä": "Ä"
}
for i in zeichenersetzen.keys():
search = search.replace(i, zeichenersetzen[i])
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 17:02
von Hyperion
@problembär: Natürlich geht das - das hat ja auch keiner bestritten, ganz im Gegenteil hatte BlackJack das direkt in seiner ersten Antwort vorgeschlagen

Außer, dass er vom Dictionary abgeraten hat; auch dafür nannte er Gründe. Oder siehst Du hier irgend welche Vorteile?
@strubi: Für derartige HTML-Entities gibt es iirc auch schon fertige Funktionen; da würde ich auf jeden Fall mal in `lxml.html` gucken.
Ansonsten stimme ich BlackJack zu, dass man für die Bibelstellen schon ein wenig in den Parser investieren sollte und anschließend dann auch eine XML-Lib für das Erstellen von Tags nutzen sollte.
Re: Variablen in reaplace
Verfasst: Montag 16. April 2012, 17:23
von BlackJack
Wenn man `lxml.html` verwendet, dann braucht man sich um die HTML-Entities gar keine Gedanken mehr machen, denn der Parser liefert Text als Unicode-Objekte.