문자열에서 숫자 제거 [닫힘]


121

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


19
함께 re:result = re.sub(r'[0-9]+', '', s)
Wiktor Stribiżew

정규식을 사용하면 \를 추가해야합니다. 또한 내가 생각하는 십진수가 될 수 있기 때문입니다. like result = re.sub (r '[0-9 \.] +', '', s)
GurhanCagin

1
"\d"정규식에서와 동일 "[0-9]"하므로 result = re.sub(r"\d+", "", s)대신 할 수 있습니다 . 속도는 사용되는 특정 문자열에 따라 달라질 수 있지만 저에게는 re.sub약 두 배가 걸렸습니다 str.translate(미리 컴파일 된 패턴을 사용하지 않으면 약간 더 오래 걸림).
Nathan

답변:


185

이것이 귀하의 상황에 적합합니까?

>>> s = '12abcd405'
>>> result = ''.join([i for i in s if not i.isdigit()])
>>> result
'abcd'

이것은 목록 이해력을 사용하며 여기에서 일어나는 일은 다음 구조와 유사합니다.

no_digits = []
# Iterate through the string, adding non-numbers to the no_digits list
for i in s:
    if not i.isdigit():
        no_digits.append(i)

# Now join all elements of the list with '', 
# which puts all of the characters together.
result = ''.join(no_digits)

@AshwiniChaudhary와 @KirkStrauser가 지적했듯이 실제로 한 줄에 괄호를 사용할 필요가 없으므로 괄호 안의 부분을 생성기 표현식으로 만듭니다 (목록 이해보다 효율적 임). 이것이 귀하의 과제에 대한 요구 사항에 맞지 않더라도 결국 읽어야 할 것입니다 :) :

>>> s = '12abcd405'
>>> result = ''.join(i for i in s if not i.isdigit())
>>> result
'abcd'

@SeanJohnson 대박! 주기가 :) 완료, 그래서 나는 확실히 나는,이 사이트에 다른 사람에서 그 배운거야
RocketDonkey

필요 없음 @RocketDonkey[]
애쉬 위니 Chaudhary

3
Python 2.7 이상에서는 목록 이해력 주위에 대괄호가 필요하지 않습니다. 생략하면 생성기 표현식이됩니다.
Kirk Strauser 2012 년

수정 됨-@ AshwiniChaudhary / @ KirkStrauser에게 감사드립니다.
RocketDonkey

@RocketDonkey도 설명을 추가하면 코드를 보는 것만으로도 OP에 도움이되지 않습니다.
Ashwini Chaudhary

98

그리고 믹스에 던져 넣는 str.translate것은 반복 / 정규식보다 훨씬 빠르게 작동하는 자주 잊혀진 것입니다.

Python 2 :

from string import digits

s = 'abc123def456ghi789zero0'
res = s.translate(None, digits)
# 'abcdefghizero'

Python 3 :

from string import digits

s = 'abc123def456ghi789zero0'
remove_digits = str.maketrans('', '', digits)
res = s.translate(remove_digits)
# 'abcdefghizero'

13
이 접근 방식은 Python3에서 작동하지 않습니다. 대신하십시오 : 'abc123def456ghi789zero0'.translate({ord(k): None for k in digits})
valignatev

3
Python2를위한 최고의 솔루션입니다.
거친 Wardhan

유니 코드 문자열에서 작동하지 않음
Harry M

20

선생님이 필터 사용을 허용하는지 확실하지 않지만 ...

filter(lambda x: x.isalpha(), "a1a2a3s3d4f5fg6h")

보고-

'aaasdffgh'

루핑보다 훨씬 효율적입니다 ...

예:

for i in range(10):
  a.replace(str(i),'')

1
대신 다음을 반환합니다. <filter object at 0x03475FD0>
lone_coder

5

이것에 대해 :

out_string = filter(lambda c: not c.isdigit(), in_string)

4
출력은 <filter object at 0x7f749e1745c0>. Python3.6
TitanFighter

당신은 목록에 필터에서 (필터 (...)) 개체를 반환 포장하여 목록 개체에 발전기를 강요 할 수 @TitanFighter
ahlusar1989

5

몇 개만 (다른 사람들은 이들 중 일부를 제안했습니다)

방법 1 :

''.join(i for i in myStr if not i.isdigit())

방법 2 :

def removeDigits(s):
    answer = []
    for char in s:
        if not char.isdigit():
            answer.append(char)
    return ''.join(char)

방법 3 :

''.join(filter(lambda x: not x.isdigit(), mystr))

방법 4 :

nums = set(map(int, range(10)))
''.join(i for i in mystr if i not in nums)

방법 5 :

''.join(i for i in mystr if ord(i) not in range(48, 58))

2
이것들에 대한 효율성 비교를 보여주는 것이 가치가 있습니다.
nu everest

2

st가 형식화되지 않은 문자열이라고 말한 다음 실행하십시오.

st_nodigits=''.join(i for i in st if i.isalpha())

앞에서 말했다시피. 그러나 내 생각에는 매우 간단한 것이 필요하므로 s 는 문자열이고 st_res 는 숫자가없는 문자열 이라고 말하면 여기에 코드가 있습니다.

l = ['0','1','2','3','4','5','6','7','8','9']
st_res=""
for ch in s:
 if ch not in l:
  st_res+=ch

1

이를 위해 정규식을 사용하고 싶지만 목록, 루프, 함수 등 만 사용할 수 있기 때문에.

여기 내가 생각해 낸 것입니다.

stringWithNumbers="I have 10 bananas for my 5 monkeys!"
stringWithoutNumbers=''.join(c if c not in map(str,range(0,10)) else "" for c in stringWithNumbers)
print(stringWithoutNumbers) #I have  bananas for my  monkeys!

1

내가 귀하의 질문을 올바르게 이해한다면 한 가지 방법은 문자열을 문자로 분해 한 다음 루프를 사용하여 해당 문자열의 각 문자를 문자열 또는 숫자인지 확인한 다음 문자열이 변수에 저장 한 다음 루프를 한 번 확인하는 것입니다. 완료되면 사용자에게 표시


for 루프는 문자열의 모든 문자를 자동으로 반복하므로 문자열을 문자로 나눌 필요가 없습니다.
Ashwini Chaudhary
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.