Ben sadece harf ve rakam var böylece bir dizeden tüm özel karakterler, noktalama işaretleri ve boşlukları kaldırmak gerekiyor.
Ben sadece harf ve rakam var böylece bir dizeden tüm özel karakterler, noktalama işaretleri ve boşlukları kaldırmak gerekiyor.
Yanıtlar:
Bu normal ifade olmadan yapılabilir:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
Şunları kullanabilirsiniz 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.
Regex kullanmakta ısrar ederseniz, diğer çözümler işe yarayacaktır. Ancak, normal bir ifade kullanmadan yapılabiliyorsa, bunun için en iyi yolun bu olduğunu unutmayın.
isalnum()
regex sürümlerini
Harf veya sayı olmayan bir karakter dizisiyle eşleşecek normal ifade:
[^A-Za-z0-9]+
Regex ikamesi yapmak için Python komutu:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
verimliliğini biraz artırmak için bir nicelleştirici ekleyeceğim .)
[^A-Za-z0-9 ]+
Daha kısa yol:
import re
cleanString = re.sub('\W+','', string )
Kelimeler ve sayılar arasında boşluk olmasını istiyorsanız '' ile '' yerine
r'\W+'
- biraz konu dışı (ve çok bilgiçlik) ama tüm regex modellerinin ham teller
Bunu gördükten sonra, hangi cevapların en kısa sürede yürütüldüğünü öğrenerek sağlanan cevapları genişletmekle ilgilenmiştim, bu yüzden geçtim ve önerilen bazı cevapları timeit
örnek dizelerden ikisine karşı kontrol ettim :
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
- Sonuç: 10.7061979771string2
- Sonuç: 7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- Sonuç: 7.10785102844string2
- Sonuç: 4.12814903259import re
re.sub('\W+','', string)
string1
- Sonuç: 3.11899876595string2
- Sonuç: 2.78014397621Yukarıdaki sonuçlar ortalamadan en düşük getirili sonucun bir ürünüdür: repeat(3, 2000000)
Örnek 3 , Örnek 1'den 3 kat daha hızlı olabilir .
''.join([*filter(str.isalnum, string)])
Bence sadece filter(str.isalnum, string)
çalışıyor
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
Python3'te, filter( )
işlev yinelenebilir bir nesne döndürür (yukarıdakinin aksine dize yerine). İtertable bir dize almak için geri katılmak gerekir:
''.join(filter(str.isalnum, string))
veya list
birleştirme kullanımında geçmek için ( emin değilim ama biraz hızlı olabilir )
''.join([*filter(str.isalnum, string)])
not: açma işlemi Python'dan[*args]
geçerli => 3.5
map
, filter
ve reduce
bunun yerine döner itertable nesne. Hala Python3 + ' ''.join(filter(str.isalnum, string))
da ''.join([*filter(str.isalnum, string)])
kabul edilen cevabı tercih ederim (veya birleştirme kullanımında listeyi geçmeyi ).
''.join(filter(str.isalnum, string))
için bir gelişme olduğundan emin değilim filter(str.isalnum, string)
. Bunu yapmak için gerçekten Pythreenic mi (evet, bunu kullanabilirsiniz)?
filter(str.isalnum, string)
filter( )
Python- 2'de olduğu gibi argüman türü yerine Python-3'de yineleyici gibi Python3'te dize döndürmüyor . +
#!/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
daha özel bir karakter ekleyebilirsiniz ve bunun yerine '' ifadesi kaldırılacak hiçbir şey ifade etmez.
Normal ifadeyi kullanan herkesten farklı olarak, istemediğimi açıkça numaralandırmak yerine, istediğim olmayan her karakteri hariç tutmaya çalışırdım.
Örneğin, yalnızca 'a'dan z'ye (büyük ve küçük harf) ve sayılardan karakterler istiyorsanız, diğer her şeyi hariç tutarım:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
Bu, "sayı olmayan her karakteri veya 'a'dan z'ye veya' A'dan Z'ye kadar olan bir karakteri boş bir dizeyle değiştir" anlamına gelir.
Aslında, ^
regex'inizin ilk yerine özel karakteri eklerseniz , olumsuzlamayı alırsınız.
Ekstra ipucu: ayrıca sonucu küçük harflerle yazmanız gerekiyorsa , şu anda büyük harf bulamadığınız sürece normal ifadeyi daha da hızlı ve kolay hale getirebilirsiniz.
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
Normal ifade kullanmak istediğinizi ve 2to3 için hazır olan Unicode-cognizant 2.x kodunu istediğinizi / ihtiyacınız olduğunu varsayarsak:
>>> 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'
>>>
En genel yaklaşım, her bir karakteri sınıflandıran unicodedata tablosunun 'kategorilerini' kullanmaktır. Aşağıdaki kod, yalnızca kategorilerine göre yazdırılabilir karakterleri filtreler:
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' ')
İlgili tüm kategoriler için yukarıdaki URL'ye bakın. Tabii ki noktalama kategorilerine göre de filtreleyebilirsiniz.
$
Her satırın sonunda ne var ?
string.punctuation aşağıdaki karakterleri içerir:
'"# $% & \! '() * +, - / :; <=> @ [\] ^ _`.? {|} ~'
Noktalama işaretlerini boş değerlerle eşleştirmek için translate ve maketrans işlevlerini kullanabilirsiniz (değiştir)
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
Çıktı:
'This is A test'
Çeviri kullan:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Uyarı: Yalnızca ascii dizelerinde çalışır.
TypeError: translate() takes exactly one argument (2 given)
py3.4 ile
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
çift tırnak işaretleri ile aynı. "" "
# 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)
ve sonucunu şu şekilde göreceksin:
'askhnlaskdjalsdk
re
ama hiç kullanmadın. Sizin replace
kriterler yalnızca bu dize için çalışır. Dizeniz ne olacak abc = "askhnl#$%!askdjalsdk"
? Desenden başka bir şey üzerinde çalışacağını sanmıyorum #$%
. Tweak
Noktalama İşaretlerini, Sayıları ve Özel Karakterleri Kaldırma
Misal :-
kod
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
Teşekkürler :)
Özel karakterler (Almanca "Umlaute" as ü
,, ä
gibi ö
) içeren Almanca, İspanyolca, Danca, Fransızca gibi diğer diller için bunları normal ifade arama dizesine eklemeniz yeterlidir:
Almanca için örnek:
re.sub('[^A-ZÜÖÄa-z0-9]+', '', mystring)