Bir dizedeki tüm alfasayısal olmayan karakterleri değiştirin


Yanıtlar:


189

Kurtarmak için normal ifade!

import re

s = re.sub('[^0-9a-zA-Z]+', '*', s)

Misal:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'

7
: Bir sürü unicode işlemek, ayrıca tüm ASCII olmayan unicode sembolleri tutmak gerekebilirre.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha

Dizenizde boşluk bırakmak istiyorsanız, parantez içinde bir boşluk eklemeniz yeterlidir: s = re.sub ('[^ 0-9a-zA-Z] +', '*', s)
stackPusher

3
Birden fazla değiştirme yapıyorsanız, normal ifadeyi önceden derlerseniz, bu biraz daha hızlı çalışacaktır, örneğin,import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris

Ayrıca \W, kelime olmayan karakterler için, neredeyse aynıdır, ancak bir kelime karakteri olarak alt çizgiye izin verir (nedenini bilmiyorum): docs.python.org/3.6/library/re.html#index-32
JHS


39

Pythonic yolu.

print "".join([ c if c.isalnum() else "*" for c in s ])

Bu, birbirini izleyen eşleşmeyen karakterlerin gruplandırılmasıyla ilgilenmez, yani

"h^&i => "h**i"h*i"normal ifade çözümlerinde olduğu gibi değil .


11

Deneyin:

s = filter(str.isalnum, s)

Python3'te:

s = ''.join(filter(str.isalnum, s))

Düzenleme: OP'nin karakter olmayanları '*' ile değiştirmek istediğini fark etti. Cevabım uymuyor


11

Kullanım \Weşdeğerdir [^a-zA-Z0-9_]. Belgeleri kontrol edin, https://docs.python.org/2/library/re.html

Import re
s =  'h^&ell`.,|o w]{+orld'
replaced_string = re.sub(r'\W+', '*', s)
output: 'h*ell*o*w*orld'

güncelleme: Bu çözüm, alt çizgiyi de hariç tutacaktır. Yalnızca harflerin ve rakamların hariç tutulmasını istiyorsanız, nneonneo ile çözüm daha uygundur.


1
Bunun yalnızca Python 2.x \Wile eşdeğer[^a-zA-Z0-9_] olduğunu unutmayın . Python 3.x'te, yalnızca if / flag kullanılması \W+ile eşdeğerdir . [^a-zA-Z0-9_]re.ASCIIre.A
Wiktor Stribiżew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.