Ganti semua karakter non-alfanumerik dalam sebuah string

99

Saya memiliki string yang ingin saya ganti karakter apa pun yang bukan karakter atau angka standar seperti (az atau 0-9) dengan tanda bintang. Misalnya, "h ^ & ell`., | Ow] {+ orld" diganti dengan "h * ell * o * w * orld". Perhatikan bahwa beberapa karakter seperti "^ &" diganti dengan satu tanda bintang. Bagaimana saya akan melakukan ini?

tchadwik.dll
sumber

Jawaban:

182

Regex untuk menyelamatkan!

import re

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

Contoh:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'
nneonneo
sumber
7
Jika Anda sering menangani unicode, Anda mungkin juga perlu menyimpan semua simbol unicode non-ASCII:re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha
Jika Anda ingin menyimpan spasi dalam string Anda, cukup tambahkan spasi di dalam tanda kurung: s = re.sub ('[^ 0-9a-zA-Z] +', '*', s)
stackPusher
2
Jika melakukan lebih dari satu penggantian, ini akan bekerja sedikit lebih cepat jika Anda melakukan pra-kompilasi regex, misalnya,import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris
Perhatikan \Wjuga untuk karakter non-kata, hampir sama tetapi memungkinkan garis bawah sebagai karakter kata (tidak tahu mengapa): docs.python.org/3.6/library/re.html#index-32
JHS
36

Cara pythonic.

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

Ini tidak berhubungan dengan pengelompokan beberapa karakter yang tidak cocok secara berurutan, yaitu

"h^&i => "h**itidak "h*i"seperti pada solusi regex.

baloan
sumber
11

Mencoba:

s = filter(str.isalnum, s)

dengan Python3:

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

Sunting: menyadari bahwa OP ingin mengganti non-karakter dengan '*'. Jawaban saya tidak sesuai

Mengenakan
sumber
11

Gunakan \Wyang setara dengan [^a-zA-Z0-9_]. Periksa dokumentasinya, 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'

update: Solusi ini juga akan mengecualikan garis bawah. Jika Anda hanya ingin huruf dan angka yang dikecualikan, maka solusi oleh nneonneo lebih tepat.

psun
sumber
1
Perhatikan bahwa \Wini setara dengan[^a-zA-Z0-9_] hanya di Python 2.x. Dalam Python 3.x, \W+setara dengan [^a-zA-Z0-9_]hanya jika re.ASCII/ re.Aflag digunakan.
Wiktor Stribiżew