문자열에서 영숫자가 아닌 모든 문자 교체


답변:


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가 아닌 유니 코드 기호를 모두 유지해야 할 수도 있습니다.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

비단뱀적인 방법.

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가 문자가 아닌 문자를 '*'로 바꾸고 싶다는 것을 깨달았습니다. 내 대답이 맞지 않아


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
참고 \W로 동일합니다[^a-zA-Z0-9_] 파이썬 2.x 또는 3.0 만 Python 3.x에서는 / 플래그가 사용되는 경우에만 \W+동일합니다 . [^a-zA-Z0-9_]re.ASCIIre.A
Wiktor Stribiżew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.