Alle Sonderzeichen entfernen

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
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

Hi,
ich suche eine Möglichkeit alle Sonderzeichens eines Strings zu entfernen,
ähnlich wie preg_replace in php!

aus str = Das & Dies is das 4. beste der 3. Welt!
soll werden = Das Dies is das 4 beste der 3 Welt

hat jemand da einen Tipp für mich?


Wäre natürlich noch besser wenn ich wie bei preg_replace genau definieren kann was entfernt wird.


gruß
Christian

p.s.
danke schon mal im voraus!
BlackJack

@Quitte: Schau Dir mal die `translate()`-Methode auf Zeichenketten an. Und falls die nicht reicht, das `re`-Modul.
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

transalte reicht glaube ich nicht!
Wenn ich das richtige sehe ist das nur ne geschickte art des replace!

Ich möchte alle sonderzeichen entfernen,
leider habe ich keine liste aller sonderzeichen!


re sieht aber gut aus, ich denke so was habe ich gesucht.


danke
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

def replace(s):
    return ''.join(c for c in s if c.isalnum())
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Quitte hat geschrieben:Ich möchte alle sonderzeichen entfernen,
leider habe ich keine liste aller sonderzeichen!
"Entfernen" im eigentlichen Sinn geht auch nicht, weil Python-Strings unveränderlich sind. Du kannst nur eine neue Zeichenkette erzeugen, die die Sonderzeichen nicht mehr enthält. Insofern ist eine Art "replace", indem die zu entfernenden Zeichen durch einen leeren String ersetzt werden, schon praktikabel. Ob es performant genug ist, musst du selbst sehen.

Wie du die "Sonderzeichen" entfernen willst, ohne zu wissen, welche das sein sollen, weiß ich allerdings nicht. Oder was meinst du, wenn du sagst, du habest keine Liste aller Sonderzeichen?
fledermausland
User
Beiträge: 12
Registriert: Freitag 22. Januar 2010, 15:38

Hey, da mach ich mit.

Code: Alles auswählen

import re
special_chars = '&.!?ÄÜÖäüöß'

def remove_chars(s):
    return ''.join(re.findall('[^' + special_chars + ']', s))
Nachtrag: warum werden hier eigentlich immer Backticks an Stelle von Anführungszeichen benutzt? Hab ich was verpasst?
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

Ja, ich weiß nicht welche sonderzeichen ich habe, trotzdem kann ich sie entfernen!
Hab es jetzt hinbekommen!

Zwar nicht sehr ellegant aber es funktioniert:

Hierdurch werden alle Sonderzeichen entfernt!

Ich kann definieren was ich behalten will ähnlich wie bei preg_replace

Code: Alles auswählen

string = (" ".join(re.findall(r"[A-Za-z0-9üäöÜÄÖß]*", string))).replace("  "," ")
Dieser Befehl lässt zum Beispiel nur Leerzeichen, große und kleine Buchstaben, Ziffern und deutsche Spezialbuchstaben übrig.
Der Rest wird entfernt!

Kann jetzt genau Definieren was behalten wird und dadurch alles unerwünschte entfernen obwohl ich das sonderzeichen nicht kenne!

danke nochmal für den Tipp mit re!



Nachtrag:

Oh, gerade gesehn das fledermausland was ähnliches gepostet hat,
aber wir gesagt, ich kenne die Sondezeichen nicht und muss daher umgekehrt herangehen!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Da hätte ich auch noch ein paar Varianten:

Code: Alles auswählen

>>> filter(str.isalnum, "abc[]äöü")
'abc'
>>> import string
>>> filter((string.ascii_letters+string.digits).__contains__, "abcd[]091ab")
'abcd091ab'
>>> import re
>>> exp = re.compile(r"[A-Za-z0-9üäöÜÄÖß]")
>>> filter(exp.match, "abcd[]ÄöÜ456")
'abcd\xc3\x84\xc3\xb6\xc3\x9c456'
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Quitte hat geschrieben:Kann jetzt genau Definieren was behalten wird und dadurch alles unerwünschte entfernen obwohl ich das sonderzeichen nicht kenne!
Indem du sie einfach nicht in die Gruppe aufnimmst. Ich bezweifle im uebrigen, dass deine RE das tut, was du denkst, denn Leerzeichen sind gar nicht in der Gruppe enthalten.

@jbs:

Code: Alles auswählen

>>> u"ü".isalnum()
True
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Oh, das wusst ich gar nicht.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Interessant ist aber folgendes:

Code: Alles auswählen

>>> 'ü'.isalnum()
False
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

@cofi
cofi hat geschrieben:
Quitte hat geschrieben:Kann jetzt genau Definieren was behalten wird und dadurch alles unerwünschte entfernen obwohl ich das sonderzeichen nicht kenne!
Indem du sie einfach nicht in die Gruppe aufnimmst. Ich bezweifle im uebrigen, dass deine RE das tut, was du denkst, denn Leerzeichen sind gar nicht in der Gruppe enthalten.

@jbs:

Code: Alles auswählen

>>> u"ü".isalnum()
True
Da kannst du zweifeln wie du willst!
Ich bezweifle eher das du weisst was das Re Tut!

Man sieht das das Leerzeichen genauso wie alle anderen Sonderzeichen durch ein Leerzeichen ersetzt werden!
Damit bleiben die Leerzeichen erhalten!
Steht doch da :-P

Probierst doch einfach mal aus!

Code: Alles auswählen

import re
string = "Das ist ein Test 4You c*f!. alle Zeichen die nicht erlaubt sind (wie z.B. das & oder [) werden durch leerzeichen ersetzt!"
print (" ".join(re.findall(r"[A-Za-z0-9üäöÜÄÖß.!()]*", string))).replace("  "," ")

Das ist ein Test 4You c f!. alle Zeichen die nicht erlaubt sind (wie z.B. das  oder  ) werden durch leerzeichen ersetzt!
natürlich kann man es auch so machen:

Code: Alles auswählen

import re
string = "Das ist ein Test 4You c*f!. alle Zeichen die nicht erlaubt sind (wie z.B. das & oder [) werden durch leerzeichen ersetzt!"
print "".join(re.findall(r"[A-Za-z0-9üäöÜÄÖß.!() ]*", string))
Das ist ein Test 4You cf!. alle Zeichen die nicht erlaubt sind (wie z.B. das  oder ) werden durch leerzeichen ersetzt!
dann verschwinden die sonderzeichen ohne mit leerzeichen ersetzt zu werden.
Ich benötigte aber die erste Variante:

also erst ausprobiere, dann zweifeln ;-)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Quitte hat geschrieben: [...]
dann verschwinden die sonderzeichen ohne mit leerzeichen ersetzt zu werden.
Ich benötigte aber die erste Variante:

also erst ausprobiere, dann zweifeln ;-)
Das Problem ist, dass du nicht weißt was du willst und wenn du es doch wissen solltest, dann hast du es uns falsch mitgeteilt.

Du hast mehrmals geschrieben, du möchtest die Sonderzeichen "entfernen". Jetzt, wo man dir eine Lösung dafür anbietet ist das auf einmal falsch und sie sollen in Leerzeichen verwandelt werden. Zudem gehst du plötzlich noch her und definierst Ausrufezeichen und Klammern als Nicht-Sonderzeichen. Dann liefert deine Variante auch noch das falsche Ergebnis, was auffällt wenn man die Leerzeichen zwischen das und oder zählt.

Flexibler (und zudem korrekt nach deiner letzten Definition) ist da folgender Ansatz:

Code: Alles auswählen

data = "Das ist ein Test 4You c*f!. alle Zeüchen die nicht erlaubt sind (wie z.B. das & oder [) werden durch leerzeichen ersetzt!"
reo = re.compile(r"[^\w\d.!()]", re.LOCALE)
foo = reo.sub(" ", data)
print(foo)
Das ist ein Test 4You c f!. alle Zeüchen die nicht erlaubt sind (wie z.B. das   oder  ) werden durch leerzeichen ersetzt!
Wenn die locale-Einstellungen passend gesetzt sind erwischst du damit tatsächlich alle Buchstaben auch ohne ä, ö und Konsorten extra definieren zu müssen.
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

@/me
Das Problem schein eher zu sein das du nicht richtig gelesen hast:
Hier ist meine Frage, gleich die erste Zeile:
Hi,
ich suche eine Möglichkeit alle Sonderzeichens eines Strings zu entfernen,
ähnlich wie preg_replace in php!
Du scheinst das überlesen zu haben oder preg_replace nicht zu kennen!
preg_replace durchsucht die Zeichenkette nach Übereinstimmungen und ersetzt sie mit einem replacement.
Dies kann man nutzen um sonderzeichen zu entfernen indem man nur die zeichen definiert die bleiben sollen!

BlackJack hat mich auf das modul re verwiesen, was genau das kann was ich möchte!
Hab doch schon genau das erhalten was ich wollte!
dafür nochmal ein Dankeschön an BlackJack

Da steht also ganz deutlich das ich es mit etwas ersetzen will.
preg_REPLACE

p.s.
REPLACE steht bestimmt nicht für löschen ;-)
aber wofür kann Replace nur stehen LOL
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Quitte hat geschrieben:...ich suche eine Möglichkeit alle Sonderzeichens eines Strings zu entfernen,...
Entfernen vs. Ersetzen? Ich lese da klar ein Entfernen.
Quitte hat geschrieben:REPLACE steht bestimmt nicht für löschen

Code: Alles auswählen

>>> 'aaaa'.replace('a', '')
''
>>> import re
>>> re.sub('.', '', 'Wo ist nur der Text hin?')
''
Quitte
User
Beiträge: 16
Registriert: Dienstag 12. Mai 2009, 17:49

jerch hat geschrieben:
Quitte hat geschrieben:...ich suche eine Möglichkeit alle Sonderzeichens eines Strings zu entfernen,...
Entfernen vs. Ersetzen? Ich lese da klar ein Entfernen.
''[/code]
Ja, ich weiss, es ist ziemlich schwer einen Satz zuende zu lesen.
Wieso zitierst du nicht den ganzen Satz?
Hi,
ich suche eine Möglichkeit alle Sonderzeichens eines Strings zu entfernen,
ähnlich wie preg_replace in php!
Ich schreibe nicht ohne Grund: ähnlich wie preg_replace in php

Hab hier jetzt auch keine Lust mehr nach Qualifizierten antwort und guten Vorschlägen von Benutzer mich hier mit Leuten rumzuplagen, die nur eine Hälte des ersten Satzen verstehen/beachten und mit mir ne halbe stunde diskutieren wollen!

Dieser Thread steht auf meiner Gedanklichen Blacklist, da er schon mit dem ersten Post beantwortet wurde!
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ja, ich weiss, es ist ziemlich schwer einen Satz zuende zu lesen.
Wieso zitierst du nicht den ganzen Satz?
Weil das nichts ändern würde:

Code: Alles auswählen

preg_replace('[a]', '', 'Was da wohl passiert?'); 
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

@Quitte: Ein Satz wie "Sorry, da habe ich mich wohl missverständlich ausgedrückt" o.ä. hätte es auch getan. Oder ist das so schwer?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Quitte hat geschrieben:Ich schreibe nicht ohne Grund: ähnlich wie preg_replace in php
Genau. Wir haben dir aufgezeigt, wie man mit regulären Ausdrücken Zeichen entfernen kann, genau so wie es mit preg_replace in PHP geht. Du hingegen tust hier so, als könne preg_replace ausschließlich Text durch Leerzeichen ersetzen. Wenn du nur eine einzige Anwendungsmöglichkeit für preg_replace kennst, dann ist es äußerst vermessen anderen mangelnde Kompetenz bei diesem Thema vorzuwerfen.
Quitte hat geschrieben:Hab hier jetzt auch keine Lust mehr nach Qualifizierten antwort und guten Vorschlägen von Benutzer mich hier mit Leuten rumzuplagen, die nur eine Hälte des ersten Satzen verstehen/beachten und mit mir ne halbe stunde diskutieren wollen!
Ein Satz von dir wie "Oh, da habe ich mich leider nicht korrekt ausgedrückt" wäre in Ordnung gewesen. Deine verzweifelt an den Haaren herbeigezogene "Argumentation" wirkt hingegen äußerst peinlich.
Antworten