Platzhalter in "replace"

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.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Moin, gibt es in replace sowas wie Platzhalter für x-beliebige Zeichen und deren Anzahl?

Code: Alles auswählen

replace("(xxx)", "")
Ich möchte ein Platzhalter der x- beliebigen Zahlen/Buchstaben zwischen den Klammern mit einen Platzhalter versehen.
Es ist ungewiss wie viele Zahlen/Buchstaben es sind.
Beim regular hab ich es so:

Code: Alles auswählen

re.search(r"(.*)", meinstring)
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Mit re.sub() kann man mittels regulärer Ausdrücke Ersetzungen durchführen. Der gezeigte reguläre Ausdruck selektiert aber einfach jede beliebige Zeichenkette. Klammern haben Bedeutung in Regex und wenn sie als Zeichen vorkommen sollen, müssen sie mit einem vorangestellten \ escaped werden. Ich habe nicht genau verstanden, was du meinst. Soll x zwischen Klammern jetzt ein Platzhalter für je ein Zeichen sein?
Zuletzt geändert von nezzcarth am Freitag 1. November 2019, 07:41, insgesamt 2-mal geändert.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Das mit den klammer war jetzt nur ein Beispiel, ja es sind x-beliebige und auch x-beliebig viele Zahlen/Buchstaben zwischen den Klammern, alles soll mit "" " (nichts) ersetzt werden.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

egon11 hat geschrieben: Freitag 1. November 2019, 06:50

Code: Alles auswählen

replace("(xxx)", "")
Ich möchte ein Platzhalter der x- beliebigen Zahlen/Buchstaben zwischen den Klammern mit einen Platzhalter versehen.
Der Code passt nicht wirklich zur Beschreibung. Willst du nur den Inhalt der Klammern ersetzen oder sollen die Klammern auch wegfallen? Bei deinem Code sehe ich gar keinen Platzhalter, sondern es wird einfach alles gelöscht. Das ist verwirrend...
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Es soll alles, also inklusive Klammern umbenannt werden.
Anderes Beispiel:

Code: Alles auswählen

string.replace("2fjghlvb2", "")
Hier soll alles inklusive die 2 umbenannt werden.
Grund, ich habe eine Datei, und da soll alles was mit 2 beginnt und 2 endet umbenannt werden.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Das könnte man in dem konkreten Beispiel mit dem regulären Ausdruck '2[^2]+2' erledigen. Der matched aber außer 22 alles, was zwischen zwei Zweien steht (Buchstaben, Whitespace, andere Zahlen,...) bis zur letzten 2 im String. Inkl. dieser selbst. Möchtest du das?

Wie soll denn das ersetz werden: 2abc2def2 ? Ganz?
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

nezzcarth hat geschrieben: Freitag 1. November 2019, 07:50 Wie soll denn das ersetz werden: 2abc2def2 ? Ganz?
Ja genau.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Dann steckt da Logik drin, nach der die Ersetzung durchgeführt wird. Dann ist das Problem nicht so trivial zu lösen.
Es würde vermutlich erheblich helfen, wenn man das konkrete Problem sehen würde und nicht etwas, "das so ähnlich aussieht".

Wenn sowohl Start- als auch Endzeichen da selbe Zeichen sind - und das Zeichen dazwischen aber ebenfalls auftreten kann (wie in dem Beispiel von nezzcarth), ist es ohne den Gesamtkontenxt zu kennen, unmöglich zu bestimmen, welches Zeichen nun was bedeutet.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

OK, konkretes Beispiel wäre, ich habe eine html Datei, mit vielen "<>" die Kopfdaten müssen weg.
In regular kann ich sie ja alle finden. Nur mein Problem ist es dann mit "replace" dies zu entfernen. Weil ja die Daten unterschiedlichen Inhalt haben, aber das "<" und ">" sind immer gleich.

Beispiel:

Code: Alles auswählen

with open("/meinhtml.txt") as txt:
	for datei in txt:
		if re.search(r"<.*>", datei):
			datei = datei.replace("<.*>", "")
			print(datei)
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Die Datei heißt "meinhtml" weil sie eigentlich HTML ist? Dann nimm einen HTML-Parser, die sind dafür da. Gefühlt immer richtig ist Beautiful Soup.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Habe ich schon versucht, aber es "verschwinden" nicht die "<>" Kopfdaten.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du schon versucht? Mach mal ein konkretes Beispiel mit realen Inputdaten und dem was Du als Output erwartest und was Du dafür schon probiert hast.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Versucht habe ich schon:

Code: Alles auswählen

with open("/meinhtml.txt") as txt:
	for datei in txt:
		soup = BeautifulSoup(datei)
		print(soup)
Ziel ist, alles was in "<>" steht zu entfernen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was soll die for-Schleife? Ist jede Zeile eine eigene HTML-Datei?

Bei HTML ist die Lösung einfach:

Code: Alles auswählen

daten = ""
Weil jede HTML-Datei üblicherweise mit < anfängt und mit > aufhört, und laut Dir alles dazwischen gelöscht werden soll.

Also, was sind die Inputs und was soll ausgegeben werden?
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Sorry ich meinte xml Seite, wo vor und nach dem eigentlichen string eine Anweisung steht. Beispiel: "<xxx>mein text</xxx>"
Zum Schluss soll nur "mein text" stehen bleiben. mehr nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@egon11: Was denn nun HTML oder XML? Bei HTML ist der Begriff „Kopfdaten“ wahrscheinlich falsch gewählt, denn da würden die meisten den Inhalt vom <head>-Element drunter verstehen.

Du musst den `Beatiful*Soup()`\s das *ganze* Dokument übergeben und nicht nur eine einzelne Zeilen. Und wenn ich das richtig verstanden habe solltest Du den umgekehrten Weg gehen: Nicht irgendwas entfernen wollen, sondern nur den Text selektieren. Das ist ganz einfach, da gibt's ein `text`-Attribut für.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

Es ist eine xml Datei.
egon11
User
Beiträge: 354
Registriert: Mittwoch 14. Dezember 2016, 20:59

__blackjack__ hat geschrieben: Freitag 1. November 2019, 10:18 solltest Du den umgekehrten Weg gehen: Nicht irgendwas entfernen wollen, sondern nur den Text selektieren
Das war aber eigentlich mein ziel.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Na dann: Auf mit der xml-Datei hinein in Beautiful Soup, durch die Tags laufen (im besten Fall haben die eine feste Struktur, denn dafür ist XML da) und aus den Tags den Text geholt.

Das funktioniert auch für das komplette Dokument, falls dir das reicht. Da du aber um die Problemerklärung streifst wie mein Kater um das Essen der Katze, weiß man das leider nicht so genau.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn es XML ist, dann nimmt man nicht BeautifulSoup sondern einfach ElementTree. Und je nach Struktur nimmt man dann findtext.
Aber Du hast immer noch nicht Deine realen Daten gezeigt, alles was Du bisher verraten hast, hat sich im Nachhinein als etwas ganz anderes herausgestellt.
Antworten