Seite 1 von 1
Zeichen aus Stringvariablen löschen
Verfasst: Montag 13. August 2007, 13:46
von BoOnOdY
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
Verfasst: Montag 13. August 2007, 14:05
von tromai
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))
Verfasst: Montag 13. August 2007, 14:13
von 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'
Verfasst: Montag 13. August 2007, 14:21
von tromai
Das ist dann die elegantere Methode von der ich sprach. Bin in der hinsicht auch eher noch Newbie

Verfasst: Montag 13. August 2007, 14:54
von BoOnOdY
Cool dankeschön =)
Verfasst: Montag 13. August 2007, 17:08
von BlackVivi
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
Verfasst: Montag 13. August 2007, 19:42
von Leonidas
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.
Verfasst: Montag 13. August 2007, 20:00
von BlackVivi
@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...
Verfasst: Montag 13. August 2007, 20:31
von Leonidas
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).
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

Verfasst: Donnerstag 15. Januar 2009, 06:30
von kromonos
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 ^^
Verfasst: Donnerstag 15. Januar 2009, 22:24
von jonas
Der Kerle hat wohl seinen Namen ändern lassen
BoOnOdY hat geschrieben:
Harald Jürgen Maier
Leonidas hat geschrieben:
Hans Juergen Maier