Zeichen aus Stringvariablen löschen

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
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Hy,

ich hab ein kleines Noobyproblem. Würde es gerne selbst durch Dokus lösen, aber ich weiß nicht nach was ich suchen soll. Würde mich über Code Snippets o.ä. freuen
:

Ich habe einen String:

Harald (Jürgen) Maier

So jetzt will ich die klammern weg haben und durch leerzeichen ersetzen.


Gruß BoOnOdY
Benutzeravatar
tromai
User
Beiträge: 92
Registriert: Mittwoch 26. April 2006, 11:20

Es gibt sicherlich elegantere Lösungen. Aber das hier sollte es tun:

Code: Alles auswählen

from re import *
text = 'Harald (Juergen) Maier'
p1 = compile('\(')
p2 = compile('\)')
newtext = p2.sub(' ', p1.sub(' ', text))
BlackJack

Mit regulären Ausdrücken wäre es sicher eleganter es mit *einem* Ausdruck zu lösen.

Ansonsten gibt's natürlich noch die `replace()`-Methode auf Zeichenketten.

Code: Alles auswählen

In [22]: import re

In [23]: text = 'Harald (Juergen) Maier'

In [24]: regex = re.compile('[()]')

In [25]: regex.sub(' ', text)
Out[25]: 'Harald  Juergen  Maier'

In [26]: text.replace('(', ' ').replace(')', ' ')
Out[26]: 'Harald  Juergen  Maier'
Benutzeravatar
tromai
User
Beiträge: 92
Registriert: Mittwoch 26. April 2006, 11:20

Das ist dann die elegantere Methode von der ich sprach. Bin in der hinsicht auch eher noch Newbie ;) :P
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Cool dankeschön =)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Noch eine Möglichkeit!

Code: Alles auswählen

def removeBrackets(s):
    temp = ""
    for i in foo:
        if i == "(" or i == ")":
            temp = "".join([temp," "])
        else:
            temp = "".join([temp,i])
    return temp
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackVivi hat geschrieben:Noch eine Möglichkeit
Dann mach ich mir auch mal dran:

Code: Alles auswählen

in [8]: import string
In [9]: 'Harald (Juergen) Maier'.translate(string.maketrans('()', '  '))
Out[9]: 'Harald  Juergen  Maier'
Ist nicht optimal, da es zu viele Leerzeichen geneiriert, aber sonst recht "unkonventionell".

Code: Alles auswählen

In [16]: ''.join(c for c in 'Harald (Jürgen) Maier' if c not in ('(', ')'))
Out[16]: 'Harald J\xc3\xbcrgen Maier'
Auch als Generator Expression lieferbar - diesmal ohne Patzer wie überflüssige Leerzeichen. Ähnelt der Lösung von BlackVivi nur etwas kompakter und möglicherweise sogar lesbarer.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

@Leonidas
BoOnOdY möchte ja "unnötige" Leerzeichen erzeugen, er hat ja zwischen den ersten Namen und dem ( ein Leerzeichen und möchte dann das ( mit einem Leerzeichen ersetzen... dadurch entstehen 2. (Unlogisch, aber Aufgabenstellung ist Aufgabenstellung)

Die untere Lösung löscht ja die Brackets einfach. Beziehungsweise... setzt aus dem bestehenden String einen neuen zusammen und ignoriert dabei die Klammern.

Vielleicht versteh ich das auch falsch...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackVivi hat geschrieben:BoOnOdY möchte ja "unnötige" Leerzeichen erzeugen, er hat ja zwischen den ersten Namen und dem ( ein Leerzeichen und möchte dann das ( mit einem Leerzeichen ersetzen... dadurch entstehen 2. (Unlogisch, aber Aufgabenstellung ist Aufgabenstellung)
Oh, tut mir leid, hab die Aufgabenstellung nicht fertiggelesen (bzw. mir selbst gedacht, was was der OP haben wollte). :evil:

Der Code der jetzt folgt nutzt den ternären Operator von Python 2.5 und wird so nicht in früheren Python-Versionen laufen. Be sure to use an up-to-date Version of Python.

Aber ich habe noch eine Lösung, die Klammern durch Spaces ersetzt:

Code: Alles auswählen

In [5]: ''.join(map(lambda char: ' ' if char in ('(', ')') else char, 'Hans (Juergen) Maier'))
Out[5]: 'Hans  Juergen  Maier'
Auch umgeschrieben, als Generator Expression:

Code: Alles auswählen

In [9]: ''.join(char if char not in ('(', ')') else ' ' for char in 'Hans (Juergen) Maier')
Out[9]: 'Hans  Juergen  Maier'
Will noch jemand weitere Lösungen? Man kann ja auch noch die ASCII-Codes einbinden:

Code: Alles auswählen

In [15]: ''.join(char if ord(char) not in range(40, 42) else ' ' for char in 'Hans (Juergen) Maier')
Out[15]: 'Hans  Juergen  Maier'
Oder noch eine weitere Möglichkeit, diese erinnert mich etwas an den Char-Datentyp in C.

Code: Alles auswählen

In [17]: ''.join(char if ord(char) not in range(ord('('), ord(')') + 1) else ' ' for char in 'Hans (Juergen) Maier')
Out[17]: 'Hans  Juergen  Maier'
Variation davon (würde wohl auf EBCDIC-Sytemen besser gehen.. ich weiß nicht wie dort die Bytes für ``(`` und ``)`` sind - möglicherweise nicht 40 und 41):

Code: Alles auswählen

In [19]: ''.join(char if ord(char) not in [ord('('), ord(')')] else ' ' for char in 'Hans (Juergen) Maier')
Out[19]: 'Hans  Juergen  Maier'
Oder.... AHH! Diese vielen kleinen Bytes, sie holen mich gleich.. nein, ich ich bin kein nicht-druckbares Zeichen! Lasst mich in Ruhe oder ich hole ich EOT und beschwöre 0x1A, SUB! Neiiiiin...

SCNR :twisted:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
kromonos
User
Beiträge: 34
Registriert: Freitag 9. Januar 2009, 02:37
Wohnort: Trier
Kontaktdaten:

Hmm .. nette Stringmanipulation ..
Meine frage ist ähnlich:
Wie kann ich leerzeichen am ende von einem String entfernen?
z.B. aus "Ich, der Held " zu "Ich, der Held"

EDIT: Hat sich erledigt. ein string.rstrip() ist die lösung ^^
xmpp:kromonos@user-helfen-usern.de
HomePage/IT-Forum: http://www.user-helfen-usern.de
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Der Kerle hat wohl seinen Namen ändern lassen :lol:
BoOnOdY hat geschrieben: Harald Jürgen Maier
Leonidas hat geschrieben: Hans Juergen Maier
Antworten