Seite 1 von 2

Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 06:50
von egon11
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)

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 07:20
von nezzcarth
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?

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 07:33
von egon11
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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 07:33
von snafu
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...

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 07:43
von egon11
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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 07:50
von nezzcarth
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?

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 08:16
von egon11
nezzcarth hat geschrieben: Freitag 1. November 2019, 07:50 Wie soll denn das ersetz werden: 2abc2def2 ? Ganz?
Ja genau.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 08:19
von sparrow
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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 08:53
von egon11
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)

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 09:07
von sparrow
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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 09:31
von egon11
Habe ich schon versucht, aber es "verschwinden" nicht die "<>" Kopfdaten.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 09:48
von Sirius3
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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 09:59
von egon11
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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 10:04
von Sirius3
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?

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 10:07
von egon11
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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 10:18
von __blackjack__
@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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 10:24
von egon11
Es ist eine xml Datei.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 10:25
von egon11
__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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 10:54
von sparrow
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.

Re: Platzhalter in "replace"

Verfasst: Freitag 1. November 2019, 11:05
von Sirius3
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.