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?


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'

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.


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


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.