文字列内のすべての非英数字を置き換えます


99

(azまたは0-9)などの標準の文字または数字ではない文字をアスタリスクで置き換えたい文字列があります。たとえば、「h ^&ell`。、| ow] {+ orld」は「h * ell * o * w * orld」に置き換えられます。「^&」などの複数の文字は1つのアスタリスクに置き換えられることに注意してください。これを行うにはどうすればよいですか?


回答:


182

救済への正規表現!

import re

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

例:

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

7
あなたは多くのことをユニコード扱う場合、あなたはまた、すべての非ASCII Unicodeのシンボルを維持する必要がありますre.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha

文字列にスペースを残したい場合は、角かっこ内にスペースを追加するだけです:s = re.sub( '[^ 0-9a-zA-Z] +'、 '*'、s)
stackPusher

2
複数の置換を行う場合、正規表現をプリコンパイルすると、わずかに速く実行されます。例:import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris

また\W、単語以外の文字についても注意してください。ほとんど同じですが、アンダースコアを単語文字として使用できます(理由は不明です):docs.python.org/3.6/library/re.html#index-32
JHS

36

Pythonの方法。

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

ただし、これは、一致しない複数の連続する文字のグループ化には対応していません。

"h^&i => "h**iない"h*i"正規表現のソリューションのように。


11

試してください:

s = filter(str.isalnum, s)

Python3の場合:

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

編集:OPがchar以外の文字を「*」に置き換えたいことを認識しました。私の答えは合わない


11

\Wと同等の使用[^a-zA-Z0-9_]。ドキュメントを確認してください、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'

更新:このソリューションでは、アンダースコアも除外されます。アルファベットと数字のみを除外したい場合は、nneonneoによる解決策がより適切です。


1
はPython 2.xのとのみ\W同等であることに[^a-zA-Z0-9_]注意してください。Python 3.xでは、/ フラグが使用されている場合\W+[^a-zA-Z0-9_]のみ同等です。re.ASCIIre.A
WiktorStribiżew2019
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.