문자열에 숫자가 포함되어 있는지 확인


196

내가 찾은 대부분의 질문은 숫자로 된 문자를 찾고 있다는 사실에 편향되어있는 반면, 나는 숫자없는 문자열이되고 싶은 숫자를 찾고 있습니다. 문자열을 입력하고 숫자가 포함되어 있고 거부하는지 확인해야합니다.

이 함수 isdigit()True모든 문자가 숫자 인 경우 에만 반환 합니다. 사용자가 숫자를 입력했는지 확인하고 싶습니다 "I own 1 dog".

어떤 아이디어?

답변:


295

당신은 사용할 수 있습니다 any로, 기능을 str.isdigit다음과 같이 기능

>>> def hasNumbers(inputString):
...     return any(char.isdigit() for char in inputString)
... 
>>> hasNumbers("I own 1 dog")
True
>>> hasNumbers("I own no dog")
False

또는 다음과 같이 정규식을 사용할 수 있습니다

>>> import re
>>> def hasNumbers(inputString):
...     return bool(re.search(r'\d', inputString))
... 
>>> hasNumbers("I own 1 dog")
True
>>> hasNumbers("I own no dog")
False

음수는 어떻습니까?
Ray

@Ray 그렇다면 RegEx는 이렇게 확장 될 수 있습니다r'-?\d+'
thefourtheye

15
어쨌든 원래 정규 표현식이 음수를 감지하지 않습니까?
confused00

1
@ confused00 Nope \d0~ 범위의 한 자릿수 만 일치 합니다 9.
thefourtheye

9
@thefourtheye : -1은 여전히 ​​숫자입니다. 이 숫자 '1'이어서 대시 인
user3183018

50

any및 의 조합을 사용할 수 있습니다 str.isdigit.

def num_there(s):
    return any(i.isdigit() for i in s)

True문자열에 숫자가 있으면 함수가 반환 하고 그렇지 않으면를 반환 False합니다.

데모:

>>> king = 'I shall have 3 cakes'
>>> num_there(king)
True
>>> servant = 'I do not have any cakes'
>>> num_there(servant)
False

임시 목록을 만들 필요가 없으며 대괄호를 제거하는 것만으로 생성기 식을 사용할 수 있습니다.
Matteo Italia

아, 그냥 any발전기 표현 을 받아들이는 것을 깨달았습니다 .
aIKid


28

https://docs.python.org/2/library/re.html

정규식을 더 잘 사용해야합니다. 훨씬 빠릅니다.

import re

def f1(string):
    return any(i.isdigit() for i in string)


def f2(string):
    return re.search('\d', string)


# if you compile the regex string first, it's even faster
RE_D = re.compile('\d')
def f3(string):
    return RE_D.search(string)

# Output from iPython
# In [18]: %timeit  f1('assdfgag123')
# 1000000 loops, best of 3: 1.18 µs per loop

# In [19]: %timeit  f2('assdfgag123')
# 1000000 loops, best of 3: 923 ns per loop

# In [20]: %timeit  f3('assdfgag123')
# 1000000 loops, best of 3: 384 ns per loop

f3는 아무것도 반환하지 않습니다
pyd

그것은 일치하는 것이 없다는 것을 의미합니다.None
zyxue

RE_D = re.compile ( '\ d') def has_digits (string) : res = RE_D.search (string) return res is None이 아님
Raul

8

문자열의 모든 문자에 isdigit () 함수를 적용 할 수 있습니다. 또는 정규식을 사용할 수 있습니다.

또한 파이썬에서 문자열에서 하나의 숫자를 어떻게 찾습니까? 숫자를 반환하는 매우 적절한 방법으로. 아래의 해결책은 그 질문에 대한 답변입니다.

number = re.search(r'\d+', yourString).group()

또는

number = filter(str.isdigit, yourString)

자세한 내용은 정규식 문서를 참조하십시오 : http://docs.python.org/2/library/re.html

편집 : 이것은 부울 값이 아닌 실제 숫자를 반환하므로 위의 답변이 귀하의 경우에 더 정확합니다

첫 번째 방법은 첫 번째 숫자와 그 이후의 연속 숫자를 반환합니다. 따라서 1.56은 1로 반환됩니다. 10,000은 10으로 반환됩니다. 0207-100-1000은 0207로 반환됩니다.

두 번째 방법은 작동하지 않습니다.

모든 숫자, 점 및 쉼표를 추출하고 비 연속 숫자를 잃지 않으려면 다음을 사용하십시오.

re.sub('[^\d.,]' , '', yourString)

3

NLTK 방법을 사용할 수 있습니다.

텍스트에서 '1'과 'One'을 모두 찾습니다.

import nltk 

def existence_of_numeric_data(text):
    text=nltk.word_tokenize(text)
    pos = nltk.pos_tag(text)
    count = 0
    for i in range(len(pos)):
        word , pos_tag = pos[i]
        if pos_tag == 'CD':
            return True
    return False

existence_of_numeric_data('We are going out. Just five you and me.')

2

다음과 같이이를 수행 할 수 있습니다.

if a_string.isdigit(): do_this() else: do_that()

https://docs.python.org/2/library/stdtypes.html#str.isdigit

사용 .isdigit()도하는 것은 의미 예외 처리에 의존하지 않아도 (지능형리스트 안에 수 없습니다 제외 / 시도)를 사용 목록 이해를 필요로하는 곳에 경우 (시도 / 제외).


2

count와 함께 range를 사용하여 범위와 비교하여 문자열에 숫자가 나타나는 횟수를 확인할 수 있습니다.

def count_digit(a):
    sum = 0
    for i in range(10):
        sum += a.count(str(i))
    return sum

ans = count_digit("apple3rh5")
print(ans)

#This print 2

2

나는 아무도의 조합 했나요 없다는 것을 놀랍 anymap:

def contains_digit(s):
    isdigit = str.isdigit
    return any(map(isdigit,s))

파이썬 3에서는 아마도 가장 빠릅니다 (아마도 정규 표현식 제외). 루프가 포함되어 있지 않기 때문에 (그리고 별칭을 지정하면 함수가 그것을 찾지 않습니다 str).

파이썬 2에서 그것을 사용하지 마십시오 map리턴한다 list, 휴식any 단락


2

이건 어때?

import string

def containsNumber(line):
    res = False
    try:
        for val in line.split():
            if (float(val.strip(string.punctuation))):
                res = True
                break
    except ValueError:
        pass
    return res

containsNumber('234.12 a22') # returns True
containsNumber('234.12L a22') # returns False
containsNumber('234.12, a22') # returns True

1
여기에 소스 코드를 버리지 마십시오. 다른 사람들이 좋아하고 찬성 할 수 있도록 친절하게 대답하십시오. 참조 : 좋은 답변을 작성하려면 어떻게합니까?
sɐunıɔ ןɐ qɐp

2

@zyxue 답변을 좀 더 명확하게 만들 것입니다.

RE_D = re.compile('\d')

def has_digits(string):
    res = RE_D.search(string)
    return res is not None

has_digits('asdf1')
Out: True

has_digits('asdf')
Out: False

@zyxue가 답변에서 제안한 솔루션 중에서 가장 빠른 벤치 마크를 가진 솔루션입니다.


1

해결하는 간단한 방법은 다음과 같습니다.

s = '1dfss3sw235fsf7s'
count = 0
temp = list(s)
for item in temp:
    if(item.isdigit()):
        count = count + 1
    else:
        pass
print count

1
스택 오버플로에 오신 것을 환영합니다! 여기에 소스 코드를 버리지 마십시오. 다른 사람들이 좋아하고 찬성 할 수 있도록 친절하게 대답하십시오. 참조 : 좋은 답변을 작성하려면 어떻게합니까?
sɐunıɔ ןɐ qɐp

1
import string
import random
n = 10

p = ''

while (string.ascii_uppercase not in p) and (string.ascii_lowercase not in p) and (string.digits not in p):
    for _ in range(n):
        state = random.randint(0, 2)
        if state == 0:
            p = p + chr(random.randint(97, 122))
        elif state == 1:
            p = p + chr(random.randint(65, 90))
        else:
            p = p + str(random.randint(0, 9))
    break
print(p)

이 코드는 적어도 대문자, 소문자 및 숫자를 포함하는 크기 n의 시퀀스를 생성합니다. while 루프를 사용하여이 이벤트를 보장했습니다.


귀하의 답변에 설명을 추가하십시오
Mastisa

1

any그리고 ord다음과 같이 목적을 제공하기 위해 결합 될 수있다.

>>> def hasDigits(s):
...     return any( 48 <= ord(char) <= 57 for char in s)
...
>>> hasDigits('as1')
True
>>> hasDigits('as')
False
>>> hasDigits('as9')
True
>>> hasDigits('as_')
False
>>> hasDigits('1as')
True
>>>

이 구현에 대한 몇 가지 사항.

  1. any C 언어에서 단락 식처럼 작동하고 문자열 'a1bbbbbbc' 'b'와 'c'가 비교되지 않은 경우 결정될 수있는 즉시 결과를 반환하기 때문에 더 좋습니다.

  2. ord'0'과 '5'또는 다른 범위 사이의 검사 번호와 같이 더 많은 유연성을 제공하기 때문에 더 좋습니다. 예를 들어, 숫자의 16 진 표현에 대한 유효성 검증기를 작성하려면 문자열에 'A'- 'F'범위의 알파벳 만 사용하십시오.


1
alp_num = [x for x in string.split() if x.isalnum() and re.search(r'\d',x) and 
re.search(r'[a-z]',x)]

print(alp_num)

알파벳과 숫자가 모두 포함 된 모든 문자열을 반환합니다. isalpha ()는 모든 숫자 또는 모든 문자가 포함 된 문자열을 반환합니다.


0

이것은 아마도 파이썬에서 가장 좋은 접근법은 아니지만 Haskeller 로서이 람다 /지도 접근법은 나에게 완벽하게 이해되고 매우 짧습니다.

anydigit = lambda x: any(map(str.isdigit, x))

물론 이름을 지정할 필요는 없습니다. 이름을처럼 사용하면 anydigit("abc123")내가 찾던 것 같은 느낌이 듭니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.