Muszę usunąć wszystkie znaki specjalne, znaki interpunkcyjne i spacje z ciągu, aby mieć tylko litery i cyfry.
Muszę usunąć wszystkie znaki specjalne, znaki interpunkcyjne i spacje z ciągu, aby mieć tylko litery i cyfry.
Odpowiedzi:
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 z
Oto wyrażenie pasujące do ciągu znaków, które nie są literami ani cyframi:
[^A-Za-z0-9]+
Oto polecenie Pythona, aby wykonać podstawienie wyrażenia regularnego:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
kwantyfikator, aby nieco poprawić jego wydajność.)
[^A-Za-z0-9 ]+
Krótsza droga:
import re
cleanString = re.sub('\W+','', string )
Jeśli chcesz, aby spacje między słowami i cyframi zastąpiły słowa „”
r'\W+'
- nieco nie na temat (i bardzo pedantyczny), ale sugeruję nawyk, aby wszystkie wzorce wyrażeń regularnych były surowymi łańcuchami
Po 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!!!'
'.join(e for e in string if e.isalnum())
string1
- Wynik: 10,7061979771string2
- Wynik: 7,78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- Wynik: 7,17785102844string2
- Wynik: 4,12814903259import 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 .
''.join([*filter(str.isalnum, string)])
Myślę, że po prostu filter(str.isalnum, string)
działa
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
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:
''.join(filter(str.isalnum, string))
lub przekazać list
dołączenie do użycia ( nie jestem pewien, ale może być trochę szybki )
''.join([*filter(str.isalnum, string)])
Uwaga: rozpakowywanie jest [*args]
ważne z Pythona> = 3.5
map
, filter
i reduce
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 poprawa filter(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 jak filter( )
w Python3 zwraca iterator zamiast typu argumentu przeciwieństwie python-2 +.
#!/usr/bin/python
import re
strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr
możesz dodać więcej znaków specjalnych, które zostaną zastąpione przez „” oznacza nic, tzn. zostaną usunięte.
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:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
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.
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
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:
>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
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:
import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien
PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))
def filter_non_printable(s):
result = []
ws_last = False
for c in s:
c = unicodedata.category(c) in PRINTABLE and c or u'#'
result.append(c)
return u''.join(result).replace(u'#', u' ')
Spójrz na podany powyżej adres URL dla wszystkich powiązanych kategorii. Możesz także oczywiście filtrować według kategorii interpunkcyjnych.
$
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ń)
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
Wynik:
'This is A test'
Użyj tłumacza:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Uwaga: Działa tylko na ciągach ascii.
TypeError: translate() takes exactly one argument (2 given)
z py3.4
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the
to samo co podwójne cudzysłowy. ”„ ”
# if we need to count the word python that ends with or without ',' or '.' at end
count = 0
for i in text:
if i.endswith("."):
text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
count += 1
print("The count of Python : ", text.count("python"))
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
i zobaczysz swój wynik jako
„askhnlaskdjalsdk
re
ale nigdy go nie użyłeś. Twoje replace
kryteria działają tylko dla tego określonego ciągu. Co jeśli twój ciąg jest abc = "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
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
Dzięki :)