Programing

파이썬에서 문자열에서 숫자가 아닌 문자를 모두 제거

crosscheck 2020. 7. 8. 07:54
반응형

파이썬에서 문자열에서 숫자가 아닌 문자를 모두 제거


파이썬에서 문자열이 아닌 모든 문자를 어떻게 제거합니까?


>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'

이것이 가장 효율적인 방법인지 확실하지 않지만 다음을 수행하십시오.

>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'

''.join부분은 모든 결과 문자를 사이에 문자없이 결합하는 것을 의미합니다. 그런 다음 나머지는 목록 이해입니다. 어쩌면 짐작할 수 있듯이 조건과 일치하는 문자열 부분 만 취합니다 isdigit.


이것은 문자열과 유니 코드 객체에서 작동합니다.

# 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'

하나 또는 두 개 이상의 제거 작업을 수행 해야하는 경우 (또는 심지어 하나의 문자열이지만 매우 긴 문자열에서!) 가장 빠른 방법은 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'
>>> 

@Ned Batchelder and @newacct provided the right answer, but ...

Just in case if you have comma(,) decimal(.) in your string:

import re
re.sub("[^\d\.]", "", "$1,999,888.77")
'1999888.77'

참고URL : https://stackoverflow.com/questions/1249388/removing-all-non-numeric-characters-from-string-in-python

반응형