2011-08-22 18 views
5

Czasami mam ciągi znaków z dziwnymi postaciami. Nie są widoczne w przeglądarce, ale są częścią ciągu i są liczone w len(). Jak mogę się tego pozbyć? Strip() usuwa normalną przestrzeń, ale nie znaki.Python - jak usunąć ukryte znaki ze stringów?

+0

Zobacz tego rozwiązania: http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python –

Odpowiedz

2

Collect zestaw znaków, które chcesz włączyć i usunąć resztę jak to

import re 
text = re.sub("[^a-z0-9]+","", text, flags=re.IGNORECASE)

usunie wszelkie inne niż znaki az, AZ i od 0 do 9.

+0

muszę pełne znaków utf8 Set:/ – robos85

+0

@ robos85, ty Potrzebuję trochę informacji, aby rozebrać taśmę lub nie. więc mogę założyć, że trzeba usunąć wszystkie nieprawidłowe znaki dla utf8? istnieje na to rozwiązanie, ale które może zawierać znaki niewidoczne/niedrukowalne. – YOU

11

Wykorzystanie kategorie znaków z modułu string. Jeśli chcesz, aby wszystkie znaki druku można zrobić

from string import printable 
new_string = ''.join(char for char in the_string if char in printable) 

Building na ciebie za odpowiedź, można to zrobić z re.sub też:

new_string = re.sub("[^{}]+".format(printable), "", the_string) 

Ponadto, jeśli chcesz zobaczyć wszystkie znaki łańcuch, nawet niedrukowalne te zawsze można zrobić

print repr(the_string) 

które pokażą takie rzeczy jak \x00 dla znaków niedrukowalnych.

+0

Z pewnością jest to poprawna odpowiedź. – dotancohen

+0

Sekund odpowiedzi odpowiadał jak urok, dzięki. – Yehonatan

1

Wyrażenia regularne to dobre i bardzo uniwersalne narzędzie do wszelkiego rodzaju analizy ciągów. Jeśli problemem jest szybkość, może ci również pomóc metoda "translate" z klasy string.

Najpierw trzeba zdefiniować ('tożsamość') mapowanie, które niczego nie zmieni:

mapping = map(chr, range(256)) 

jeśli chcesz zastąpić każdy "a" przez "b", zmodyfikować mapowanie

mapping[ord('a')] = 'b' 

teraz można zbudować tabelę dla metody "przetłumaczyć":

table = "".join(mapping) 

i

print "abc".translate(table) 

drukuje "bbc".

Jeśli naprawdę chcesz usunąć „A”, nie modyfikować mapowanie powyżej, zbudować tabelę, a następnie zadzwonić przetłumaczyć następująco:

print "abc".translate(table, "a") 

daje „BC”.

Po zbudowaniu tabeli, metoda tłumaczenia jest bardzo szybka.

Więc w twoim przypadku można zmodyfikować odwzorowanie takie, że wszystkie niechciane znaki są odwzorowane na spacji

mapping = map(chr, range(256)) 
table = "".join(" " if c in unwanted_chars else c for c in map(chr, range(256))) 

i używać len("my string".translate(table).trim()) który ignoruje niechciane znaki na początku i końca łańcucha.

Lub używasz len("my string".translate(table, unwanted_chars)), które zignoruje wszystkie niechciane znaki.

+0

Nice. +1 jutro, kiedy znów będę głosować. Myślałem o tłumaczeniu, ale byłem zbyt leniwy, by sprawdzić składnię. – agf

Powiązane problemy