Seite 1 von 1

Filtern: nur ASCII Zeichen aus einem String...

Verfasst: Mittwoch 3. Mai 2006, 08:04
von jens
Das haben wir bestimmt schon irgendwo besprochen... Aber ich finde es auf die schnelle nicht...

Wie kann ich aus einem String nur die ASCII Zeichen herraus filtern?

Re: Filtern: nur ASCII Zeichen aus einem String...

Verfasst: Mittwoch 3. Mai 2006, 08:36
von gerold
jens hat geschrieben:Wie kann ich aus einem String nur die ASCII Zeichen herraus filtern?
Hi Jens!

Vielleich so:

Code: Alles auswählen

import string
new_string = "".join([ ch for ch in old_string if ch in string.ascii_letters ])
lg
Gerold
:-)

Verfasst: Mittwoch 3. Mai 2006, 08:48
von jens
Super, Danke! :lol:

Verfasst: Mittwoch 3. Mai 2006, 16:07
von mitsuhiko
Oder noch einfacher:

Code: Alles auswählen

def make_ascii(s):
    if isinstance(s, unicode):
        s = s.encode('ascii', 'ignore')
    else:
        s = s.decode('ascii', 'ignore')
    return str(s)
Ich glaub auch, dass das etwas schneller sein wird.

Verfasst: Donnerstag 4. Mai 2006, 06:11
von jens
@blackbird: Auch nicht schlecht...

Ich hab allerdings das ganze nochmals anders gemacht, weil ich möchte, das immer der erste Buchstabe groß ist.

Ist ein wenig so, wie der Anchor-Parser im wiki.python.de ;)

Code: Alles auswählen

def getUniqueShortcut(pageName, nameList):
    """
    Liefert einen eindeutige Abkürzung von pageName zurück.
    pageName wird von Sonderzeichen gesäubert und evtl. eine
    Zahl angehanden, wenn der Kurzname schon in nameList vorkommt.
    """
    import string

    # Nur ASCII Zeichen erlauben und gleichzeitig trennen
    parts = [""]
    for char in pageName:
        if not char in string.ascii_letters:
            parts.append("")
        else:
            parts[-1] += char

    print "->", parts # Debug

    # Erster Buchstabe immer groß geschrieben
    parts = [i[0].upper() + i[1:] for i in parts if i!=""]
    shortcut = "".join(parts)

    # doppelte Namen mit Zahlen eindeutig machen
    if shortcut in nameList:
        for i in xrange(1, 1000):
            testname = "%s%i" % (shortcut, i)
            if testname not in nameList:
                shortcut = testname
                break

    return shortcut



nameList = ["GibtsSchon","UndAuchDas","UndAuchDas1","UndAuchDas2"]

print getUniqueShortcut("Ich bin neu!", nameList)
print getUniqueShortcut("gibts schon", nameList)
print getUniqueShortcut("#und!auch(das)", nameList)
Ausgabe:

Code: Alles auswählen

-> ['Ich', 'bin', 'neu', '']
IchBinNeu
-> ['gibts', 'schon']
GibtsSchon1
-> ['', 'und', 'auch', 'das', '']
UndAuchDas3

Verfasst: Donnerstag 4. Mai 2006, 06:56
von rayo
Hi

Nur so ne Frage:
Wieso brauchts das parts.append("")?

Code: Alles auswählen

if not char in string.ascii_letters:
            parts.append("")
        else:
            parts[-1] += char
Gruss

Verfasst: Donnerstag 4. Mai 2006, 08:32
von jens
rayo hat geschrieben:Wieso brauchts das parts.append("")?
Damit ich eine Liste bekomme:

Code: Alles auswählen

"#und!auch(das)" --> ['', 'und', 'auch', 'das', '']
Jedes Sonderzeichen macht einen neuen Eintrag in der Liste. So hab ich die Wörter an den Sonderzeichen getrennt. Das mach ich um den jeweils ersten Buchstaben mit .upper() bearbeiten zu können, bevor ich ein "".join() mache...

Weiß keinen besseren Weg...