파이썬을 사용하여 문자열에서 숫자를 제외한 문자를 제거하시겠습니까?
문자열에서 숫자를 제외한 모든 문자를 제거하려면 어떻게 해야 합니까?
사용하다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
'bestsource' 카테고리의 다른 글
쿼츠 스케줄러의 각 테이블은 무엇을 의미합니까? (0) | 2023.06.28 |
---|---|
실행 중인 스크립트의 경로 결정 (0) | 2023.06.28 |
JsonModule이 Angular 10에서 작동하지 않음을 확인합니다. (0) | 2023.06.28 |
SQL Server 세션에서 자동 커밋을 설정하는 방법은 무엇입니까? (0) | 2023.06.28 |
Firebase Cloud Messaging in Firebase Cloud Functions를 사용하여 푸시 알림을 보내려고 할 때 요청한 엔티티를 찾을 수 없습니다. (0) | 2023.06.28 |