Variablen in reaplace

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
strubi
User
Beiträge: 4
Registriert: Montag 16. April 2012, 10:47

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
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.
strubi
User
Beiträge: 4
Registriert: Montag 16. April 2012, 10:47

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:

Code: Alles auswählen

books = ["[1-5][ ]?Mo","Jos","Ri","Rut"]
Nun möchte ich die Stellen mit re.sub neu konfigurieren:

Code: Alles auswählen

search=re.sub(r"(" + books + ")", r"£\1", search)
(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
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich verlinke mal den Ursprungsthread aus uu.de ;-)

Ich nehme an, es handelt sich immer noch um dieses Problem?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
strubi
User
Beiträge: 4
Registriert: Montag 16. April 2012, 10:47

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!
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…
strubi
User
Beiträge: 4
Registriert: Montag 16. April 2012, 10:47

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
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("&nbsp;", " ")				# Leerzeichen ersetzen
search = search.replace("&auml;", "ä")				# ä ersetzen
search = search.replace("&Auml;", "Ä")				# Ä ersetzen
Wie kann ich nun die Such und Ersetzfunktionen (z.B. "&nbsp;", " " und "&auml;", "ä") in eine Variable speichern?

Ich stelle mir das so vor:

Code: Alles auswählen

zeichenersetzen = {
	"&nbsp;" : " ",
	"&auml;": "ä",
	"&Auml;", "Ä"
	}

search = search.replace(zeichenersetzen)
Aber das funktioniert so nicht...
Warum sollte das nicht so gehen (ungetestet)? :

Code: Alles auswählen

zeichenersetzen = {
	"&nbsp;" : " ",
	"&auml;": "ä",
	"&Auml;": "Ä"
	}
for i in zeichenersetzen.keys():
    search = search.replace(i, zeichenersetzen[i])
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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.
Antworten