파이썬에서 문자열이 아닌 모든 문자를 어떻게 제거합니까?
답변
>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'
답변
이것이 가장 효율적인 방법인지 확실하지 않지만
>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'
이 ''.join
부분은 모든 결과 문자를 사이에 문자없이 결합하는 것을 의미합니다. 그런 다음 나머지는 목록 이해입니다. 어쩌면 짐작할 수 있듯이 조건과 일치하는 문자열 부분 만 취합니다 isdigit
.
답변
이것은 Python2의 문자열과 유니 코드 객체와 Python3의 문자열과 바이트 모두에서 작동합니다.
# python <3.0
def only_numerics(seq):
return filter(type(seq).isdigit, seq)
# python ≥3.0
def only_numerics(seq):
seq_type= type(seq)
return seq_type().join(filter(seq_type.isdigit, seq))
답변
믹스에 다른 옵션을 추가하기 위해 string
모듈 내에 몇 가지 유용한 상수가 있습니다 . 다른 경우에는 더 유용하지만 여기서 사용할 수 있습니다.
>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
모듈에는 다음을 포함하여 몇 가지 상수가 있습니다.
ascii_letters
(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)hexdigits
(0123456789abcdefABCDEF)
이 상수를 많이 사용하는 경우에 상수를 은폐하는 것이 좋습니다 frozenset
. 이를 통해 O (n) 대신 O (1) 조회를 사용할 수 있습니다. 여기서 n은 원래 문자열의 상수 길이입니다.
>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'
답변
@ Ned Batchelder와 @newacct가 정답을 제공했지만 …
문자열에 쉼표 (,) decimal (.)이있는 경우를 대비하여 :
import re
re.sub("[^\d\.]", "", "$1,999,888.77")
'1999888.77'
답변
하나 또는 두 개 이상의 제거 작업을 수행 해야하는 경우 (또는 심지어 하나의 문자열이지만 매우 긴 문자열에서!) 가장 빠른 방법은 translate
준비가 필요하더라도 문자열 의 방법에 의존하는 것입니다.
>>> import string
>>> allchars = ''.join(chr(i) for i in xrange(256))
>>> identity = string.maketrans('', '')
>>> nondigits = allchars.translate(identity, string.digits)
>>> s = 'abc123def456'
>>> s.translate(identity, nondigits)
'123456'
이 translate
방법은 바이트 문자열, btw보다 유니 코드 문자열에서 다르며 어쩌면 사용하기가 더 간단합니다.
>>> unondig = dict.fromkeys(xrange(65536))
>>> for x in string.digits: del unondig[ord(x)]
...
>>> s = u'abc123def456'
>>> s.translate(unondig)
u'123456'
실제 dict 대신 매핑 클래스를 사용하려고 할 수 있습니다. 특히 유니 코드 문자열에 ord 값이 매우 높은 문자가 포함될 수있는 경우 (dict가 지나치게 큰 😉 예를 들면 다음과 같습니다.
>>> class keeponly(object):
... def __init__(self, keep):
... self.keep = set(ord(c) for c in keep)
... def __getitem__(self, key):
... if key in self.keep:
... return key
... return None
...
>>> s.translate(keeponly(string.digits))
u'123456'
>>>
답변
많은 정답이지만 정규 표현식을 사용하지 않고 직접 부동 소수점으로 원할 경우 :
x= '$123.45M'
float(''.join(c for c in x if (c.isdigit() or c =='.'))
123.45
필요에 따라 쉼표의 포인트를 변경할 수 있습니다.
숫자가 정수라는 것을 알고 있다면 이것을 변경하십시오.
x='$1123'
int(''.join(c for c in x if c.isdigit())
1123