bestsource

파이썬을 사용하여 문자열에서 숫자를 제외한 문자를 제거하시겠습니까?

bestsource 2023. 6. 28. 21:52
반응형

파이썬을 사용하여 문자열에서 숫자를 제외한 문자를 제거하시겠습니까?

문자열에서 숫자를 제외한 모든 문자를 제거하려면 어떻게 해야 합니까?

사용하다re.sub이와 같이:

>>> import re
>>> re.sub('\D', '', 'aas30dsa20')
'3020'

\D는 숫자가 아닌 모든 문자와 일치하므로 위의 코드는 기본적으로 빈 문자열에 대한 모든 숫자가 아닌 문자를 대체합니다.

또는 사용할 수 있습니다.filter이와 같이(Python 2에서):

>>> filter(str.isdigit, 'aas30dsa20')
'3020'

파이썬 3부터,filter를 반환하지 않고 반복기를 반환합니다.list대신 다음을 사용할 수 있습니다.

>>> ''.join(filter(str.isdigit, 'aas30dsa20'))
'3020'

Python 2.*에서 가장 빠른 접근 방식은.translate방법:

>>> x='aaa12333bb445bb54b5b52'
>>> import string
>>> all=string.maketrans('','')
>>> nodigs=all.translate(all, string.digits)
>>> x.translate(all, nodigs)
'1233344554552'
>>> 

string.maketrans이 경우와 동일한 변환 테이블(길이 256의 문자열)을 만듭니다.''.join(chr(x) for x in range(256))(만드는 속도가 빠름;-). .translate변환 테이블을 적용합니다(여기서는 이후로 관련이 없습니다).all기본적으로 정체성을 의미합니다.) 그리고 두 번째 인수인 키 부분에 있는 문자를 삭제합니다.

.translate유니코드 문자열(및 파이썬 3의 문자열)에서 매우 다르게 작동합니다. 파이썬의 주요 릴리스가 어떤 것인지에 대한 질문이 지정되었으면 합니다!) -- 이렇게 간단하지도 않고, 이렇게 빠르지도 않지만 여전히 사용할 수 있습니다.

다시 2.*로 돌아가서 성능 차이가 매우 큽니다.:

$ python -mtimeit -s'import string; all=string.maketrans("", ""); nodig=all.translate(all, string.digits); x="aaa12333bb445bb54b5b52"' 'x.translate(all, nodig)'
1000000 loops, best of 3: 1.04 usec per loop
$ python -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
100000 loops, best of 3: 7.9 usec per loop

속도를 7~8배 높이는 것은 땅콩이 아니기 때문에,translate방법은 알고 사용할 가치가 충분히 있습니다.다른 인기 있는 비 RE 접근법은...:

$ python -mtimeit -s'x="aaa12333bb445bb54b5b52"' '"".join(i for i in x if i.isdigit())'
100000 loops, best of 3: 11.5 usec per loop

RE보다 50% 느리기 때문에.translate접근 방식이 몇 배 이상 차이가 납니다.

Python 3 또는 Unicode의 경우 다음을 통과해야 합니다..translate반환하는 매핑(문자가 아닌 서수를 키로 사용)None삭제할 내용을 입력합니다.다음은 몇 개의 문자를 제외한 모든 문자를 삭제하기 위한 편리한 표현 방법입니다.

import string

class Del:
  def __init__(self, keep=string.digits):
    self.comp = dict((ord(c),c) for c in keep)
  def __getitem__(self, k):
    return self.comp.get(k)

DD = Del()

x='aaa12333bb445bb54b5b52'
x.translate(DD)

또한 방출합니다.'1233344554552'하지만, xx.py 에 이것을 넣는 것은 우리가 있습니다.:

$ python3.1 -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'
100000 loops, best of 3: 8.43 usec per loop
$ python3.1 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)'
10000 loops, best of 3: 24.3 usec per loop

...이는 이러한 "스캐너" 작업의 경우 성능 이점이 사라지고 성능 저하로 이어진다는 것을 보여줍니다.

s=''.join(i for i in s if i.isdigit())

다른 제너레이터 변형입니다.

필터를 사용할 수 있습니다.

filter(lambda x: x.isdigit(), "dasdasd2313dsa")

python 3.0에서 당신은 이것에 참여해야 합니다 (좀 못생겼습니다 :( )

''.join(filter(lambda x: x.isdigit(), "dasdasd2313dsa"))

Regex를 사용하여 쉽게 수행할 수 있습니다.

>>> import re
>>> re.sub("\D","","£70,000")
70000

바이어의 대답에 따라:

''.join(i for i in s if i.isdigit())

opp는 댓글에서 소수점을 유지하고 싶다고 언급합니다.예를 들어 유지할 문자를 명시적으로 나열하여 re.sub 메서드(초 및 IMHO 최상의 답변에 따름)를 사용하여 이 작업을 수행할 수 있습니다.

>>> re.sub("[^0123456789\.]","","poo123.4and5fish")
'123.45'
x.translate(None, string.digits)

문자열에서 모든 숫자를 삭제합니다.문자를 삭제하고 숫자를 유지하려면 다음 작업을 수행합니다.

x.translate(None, string.letters)

생성기 식을 사용합니다.

>>> s = "foo200bar"
>>> new_s = "".join(i for i in s if i in "0123456789")

파이썬 3용 빠른 버전:

# xx3.py
from collections import defaultdict
import string
_NoneType = type(None)

def keeper(keep):
    table = defaultdict(_NoneType)
    table.update({ord(c): c for c in keep})
    return table

digit_keeper = keeper(string.digits)

다음은 정규식과 비교한 성능입니다.

$ python3.3 -mtimeit -s'import xx3; x="aaa12333bb445bb54b5b52"' 'x.translate(xx3.digit_keeper)'
1000000 loops, best of 3: 1.02 usec per loop
$ python3.3 -mtimeit -s'import re; r = re.compile(r"\D"); x="aaa12333bb445bb54b5b52"' 'r.sub("", x)'
100000 loops, best of 3: 3.43 usec per loop

그래서 저는 정규식보다 3배 이상 빠릅니다. 또한보빠릅다니보다 빠릅니다class Del, 에위, 냐면하 때문입니다.defaultdict모든 검색을 (느린) Python이 아닌 C로 수행합니다.여기 제 시스템에 있는 버전이 비교를 위해 있습니다.

$ python3.3 -mtimeit -s'import xx; x="aaa12333bb445bb54b5b52"' 'x.translate(xx.DD)'
100000 loops, best of 3: 13.6 usec per loop

시도:

import re

string = '1abcd2XYZ3'
string_without_letters = re.sub(r'[a-z]', '', string.lower())

이것은 다음을 제공해야 합니다.

123

못생겼지만 작동합니다.

>>> s
'aaa12333bb445bb54b5b52'
>>> a = ''.join(filter(lambda x : x.isdigit(), s))
>>> a
'1233344554552'
>>>
$ python -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'

100000개의 루프, 루프당 3:2.48 usec 최적

$ python -mtimeit -s'import re; x="aaa12333bab445bb54b5b52"' '"".join(re.findall("[a-z]+",x))'

100000 루프, 루프당 3:2.02 usec 최적

$ python -mtimeit -s'import re;  x="aaa12333bb445bb54b5b52"' 're.sub(r"\D", "", x)'

100000개의 루프, 최고의 3:2.37 usec/루프

$ python -mtimeit -s'import re; x="aaa12333bab445bb54b5b52"' '"".join(re.findall("[a-z]+",x))'

100000개 루프, 루프당 3:1.97 usec 최적

나는 서브보다 조인이 빠르다는 것을 관찰했습니다.

각 문자를 읽을 수 있습니다.숫자인 경우 답변에 포함합니다.str.isdigit() method는 문자가 숫자인지 알 수 있는 방법입니다.

your_input = '12kjkh2nnk34l34'
your_output = ''.join(c for c in your_input if c.isdigit())
print(your_output) # '1223434'

조인 + 필터 + 람다를 사용할 수 있습니다.

''.join(filter(lambda s: s.isdigit(), "20 years ago, 2 months ago, 2 days ago"))

출력: '2022'

하나의 라이너가 아니라 매우 단순합니다.

buffer = ""
some_str = "aas30dsa20"

for char in some_str:
    if not char.isdigit():
        buffer += char

print( buffer )

이거 썼어요. 'letters'삭제할 모든 문자가 포함되어 있어야 합니다.

Output = Input.translate({ord(i): None for i in 'letters'}))

예:

Input = "I would like 20 dollars for that suit" Output = Input.translate({ord(i): None for i in 'abcdefghijklmnopqrstuvwxzy'})) print(Output)

출력:20

my_string="sdfsdfsdfsfsdf353dsg345435sdfs525436654.dgg(" 
my_string=''.join((ch if ch in '0123456789' else '') for ch in my_string)
print(output:+my_string)

출력 : 353345435525436654

또 다른 하나:

import re

re.sub('[^0-9]', '', 'ABC123 456')

결과:

'123456'

언급URL : https://stackoverflow.com/questions/1450897/remove-characters-except-digits-from-string-using-python

반응형