Muszę usunąć wszystkie znaki specjalne, znaki interpunkcyjne i spacje z ciągu, aby mieć tylko litery i cyfry.
236
Można to zrobić bez wyrażenia regularnego:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
Możesz użyć str.isalnum
:
S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
Jeśli nalegasz na użycie wyrażenia regularnego, inne rozwiązania sprawdzą się. Należy jednak pamiętać, że jeśli można tego dokonać bez użycia wyrażenia regularnego, jest to najlepszy sposób, aby to zrobić.
isalnum()
wersje i wyrażenia regularne, a jeden zOto wyrażenie pasujące do ciągu znaków, które nie są literami ani cyframi:
Oto polecenie Pythona, aby wykonać podstawienie wyrażenia regularnego:
źródło
+
kwantyfikator, aby nieco poprawić jego wydajność.)[^A-Za-z0-9 ]+
Krótsza droga:
Jeśli chcesz, aby spacje między słowami i cyframi zastąpiły słowa „”
źródło
r'\W+'
- nieco nie na temat (i bardzo pedantyczny), ale sugeruję nawyk, aby wszystkie wzorce wyrażeń regularnych były surowymi łańcuchamiPo tym, zainteresowałem się rozszerzeniem podanych odpowiedzi, dowiedzieć się, które polecenie wykonuje się w jak najkrótszym czasie, więc przejrzałem i sprawdziłem niektóre z proponowanych odpowiedzi pod kątem
timeit
dwóch przykładowych ciągów:string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
Przykład 1
'.join(e for e in string if e.isalnum())
string1
- Wynik: 10,7061979771string2
- Wynik: 7,78372597694Przykład 2
import re re.sub('[^A-Za-z0-9]+', '', string)
string1
- Wynik: 7,17785102844string2
- Wynik: 4,12814903259Przykład 3
import re re.sub('\W+','', string)
string1
- Wynik: 3,11899876595string2
- Wynik: 2,78014397621Powyższe wyniki są wynikiem najniższego zwracanego wyniku ze średniej:
repeat(3, 2000000)
Przykład 3 może być 3 razy szybszy niż w przykładzie 1 .
źródło
''.join([*filter(str.isalnum, string)])
Python 2. *
Myślę, że po prostu
filter(str.isalnum, string)
działaPython 3. *
W Python3
filter( )
funkcja zwróci obiekt itertowalny (zamiast ciągu w przeciwieństwie do powyższego). Trzeba połączyć się z powrotem, aby uzyskać ciąg z itertable:lub przekazać
list
dołączenie do użycia ( nie jestem pewien, ale może być trochę szybki )Uwaga: rozpakowywanie jest
[*args]
ważne z Pythona> = 3.5źródło
map
,filter
ireduce
powraca itertable Object zamiast. Nadal w Python3 + wolę''.join(filter(str.isalnum, string))
(lub przekazać listę przy łączeniu''.join([*filter(str.isalnum, string)])
) niż zaakceptowaną odpowiedź.''.join(filter(str.isalnum, string))
czy poprawafilter(str.isalnum, string)
, przynajmniej do czytania. Czy to naprawdę jest Pythreenic (tak, możesz tego użyć), aby to zrobić?filter(str.isalnum, string)
nie zwracają ciąg w Python3 jakfilter( )
w Python3 zwraca iterator zamiast typu argumentu przeciwieństwie python-2 +.możesz dodać więcej znaków specjalnych, które zostaną zastąpione przez „” oznacza nic, tzn. zostaną usunięte.
źródło
W odróżnieniu od innych osób używających wyrażenia regularnego, starałbym się wykluczyć każdą postać, która nie jest tym, czego chcę, zamiast wyraźnego wyliczenia tego, czego nie chcę.
Na przykład, jeśli chcę tylko znaki od „a do z” (wielkie i małe litery) oraz cyfry, wykluczę wszystko inne:
Oznacza to „zamień pusty znak na każdy znak, który nie jest liczbą, lub znak z zakresu od„ a do z ”lub„ A do Z ”.
W rzeczywistości, jeśli wstawisz znak specjalny
^
na pierwszym miejscu wyrażenia regularnego, otrzymasz negację.Dodatkowa wskazówka: jeśli musisz również pomniejszyć wynik, możesz sprawić, że wyrażenie regularne będzie jeszcze szybsze i łatwiejsze, o ile nie znajdziesz teraz wielkich liter.
źródło
Zakładając, że chcesz użyć wyrażenia regularnego i potrzebujesz / potrzebujesz kodu rozpoznającego Unicode 2.x, który jest gotowy na 2to3:
źródło
źródło
Najbardziej ogólnym podejściem jest użycie „kategorii” tabeli unicodedata, która klasyfikuje każdy pojedynczy znak. Np. Poniższy kod filtruje tylko znaki drukowalne na podstawie ich kategorii:
Spójrz na podany powyżej adres URL dla wszystkich powiązanych kategorii. Możesz także oczywiście filtrować według kategorii interpunkcyjnych.
źródło
$
na końcu każdej linii?string.punctuation zawiera następujące znaki:
Możesz użyć funkcji translacji i maketrans do mapowania interpunkcji na puste wartości (zamień)
Wynik:
źródło
Użyj tłumacza:
Uwaga: Działa tylko na ciągach ascii.
źródło
TypeError: translate() takes exactly one argument (2 given)
z py3.4to samo co podwójne cudzysłowy. ”„ ”
źródło
i zobaczysz swój wynik jako
„askhnlaskdjalsdk
źródło
re
ale nigdy go nie użyłeś. Twojereplace
kryteria działają tylko dla tego określonego ciągu. Co jeśli twój ciąg jestabc = "askhnl#$%!askdjalsdk"
? Nie sądzę, że zadziała na czymkolwiek innym niż#$%
wzór. Może chcę to poprawićUsuwanie interpunkcji, cyfr i znaków specjalnych
Przykład: -
Kod
Wynik:-
Dzięki :)
źródło