파이썬에서 문자열이 숫자로 시작하는지 확인하는 방법은 무엇입니까?


91

나는 숫자 (0-9)로 시작하는 문자열을 가지고 있습니다.

그래서 글을 쓰는 대신

if (string.startswith('0') || string.startswith('2') ||
    string.startswith('3') || string.startswith('4') ||
    string.startswith('5') || string.startswith('6') ||
    string.startswith('7') || string.startswith('8') ||
    string.startswith('9')):
    #do something

더 영리하고 효율적인 방법이 있습니까?


"이것이 너무 반복적입니까?"라는 질문이있는 경우, 높은 수준의 언어에서 대답은 "왜 그렇습니다."입니다. 게을러 라!

42
을 (를) 놓쳤습니다 string.startswith('1').
— MAK 2011

2
@Illusionist 작성된대로 질문은 한 자리로 시작하는 문자열을 감지하고 싶다는 의미입니다. 그렇다면 다음 질문 중 유일한 정답은 s[0]또는 s[:1]John Machin의 솔루션을 사용하는 것 if s.startswith(tuple('0123456789'))입니다.. 또한이 솔루션은 s 가 튜플 또는 목록과 같은 시퀀스 일 때 오류를 발생 시키며,이 경우 문자열 인 것처럼 동일한 결과가 생성됩니다. -또 다른 해결책은 패턴이 '\ d (? = \ D)' 인 정규식이지만 여기서 정규식 사용은 불필요합니다.
— eyquem 2011-08-20

3
현명한 것 : string은 표준 라이브러리의 모듈이며 아마도 변수 이름으로 사용해서는 안됩니다. docs.python.org/2/library/string.html
— GAK

답변:


170

Python의 string라이브러리에는 다음과 같은 isdigit()방법이 있습니다.

string[0].isdigit()

5
Python2의 string 모듈 에는 메서드가 없으며 및 객체 isdigit의 메서드입니다 . strunicode
— John Machin

3
@plaes : -1 때문에의 PLUS는 충돌 위의 == ""만약
— 존 머신

3
빈 문자열에 대해 깨지지 않는 내 대답을보십시오.string[:1].isdigit()
— PascalVKooten

24
>>> string = '1abc'
>>> string[0].isdigit()
True

나는 파이썬 녀석이 아니기 때문에 아마 당신이 이것에 대해 나를 도울 수있을 것입니다 :이 함수가 ""에 폭탄이 string[0]될까요?
— corsiKa 2011

네, 확실합니다. 당신은 (문자열 또는 'X') [0]을 사용할 수 .isdigit () ''그것을 수정하거나 None (없음)
— jcomeau_ictx

30
을 시도 string[:1].isdigit()하면 빈 문자열을 처리하여 행복하게 종료됩니다.
— Simon Callan 2011

2
내 대답이 아니기 때문입니다. 프로그래머가 빈 문자열에서 예외가 발생하기를 원하는 경우에는 내 것이 여전히 좋습니다.
— jcomeau_ictx 2015-10-29

1
@jcomeau_ictx 정확히 맞습니다. 방어 적으로 프로그램하지 마십시오. 문자열이 예기치 않게 공백이면 오류 가 발생하고 자동으로 처리되지 않아야합니다. 일부 사고 방식은 경고로 중요하지 않은 예외를 우아하게 처리하고 포착하고 프로그램을 계속 진행해야한다고 말합니다. 나는 대부분의 사용 사례에서 이러한 사고 방식이 아닙니다. 작성중인 함수 및 코드의 특수성은 방어 적으로 더 자주 코딩해야하는 경우를 완화하는 데 도움이됩니다.
— jamescampbell

10

때로는 정규식을 사용할 수 있습니다.

>>> import re
>>> re.search('^\s*[0-9]',"0abc")
<_sre.SRE_Match object at 0xb7722fa8>

지나침! 사용하는 이유는 당신이 bultins에 그것을 할 수있을 때 다시
— 야콥 보이어

1
@JakobBowyer 적어도 그것에 대해 아는 것이 좋습니다! 이 경우에도 그렇습니다. 일부 내장 기능이 똑같이 할 수 있다면 정규식은 과잉입니다.
— jeromej

8

코드가 작동하지 않습니다. 당신이 필요로 or하는 대신 ||.

시험

'0' <= strg[:1] <= '9'

또는

strg[:1] in '0123456789'

또는, 당신이 정말로 미친 약이 있다면 startswith,

strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))

startswith (a tuple)이 있는 솔루션 만 있다면 나는 당신을 upvoted했을 것 입니다. 그러나이 솔루션 strg[:1]에는 두 가지 불편 함이 있습니다. s 가 문자열 목록 일 경우 오류를 발생시키지 않고 문자열이 여러 자리로 시작하면 True 를 생성 합니다.
— eyquem 2011-08-20

@eyquem 문자열이 여러 자리로 시작하면 True를 생성합니다. 그래서? 다른 답변은 다른 문자가 숫자가 아닌지 확인해야하는 요구 사항이 아니기 때문에 확인하지 않습니다.
— 롭 그랜트

나는 나는 미친 startswith그리고 내 코드에서이 방법을 구현했다. 감사합니다.
— jamescampbell

가능성에서 하나 더 시작 ...startswith(tuple(str(i) for i in range(10)))
— Jérôme

4

이 코드 조각 :

for s in ("fukushima", "123 is a number", ""):
    print s.ljust(20),  s[0].isdigit() if s else False

다음을 인쇄합니다.

fukushima            False
123 is a number      True
                     False

4
그것은 못 생겼다. 사용 s[:1].isdigit()또는s and s[0].isdigit()
— John Machin

1
@John Machin '못생긴'이란 무엇을 의미합니까? 읽을 수 없습니까? 위의 제안이 더 읽기 쉬운 것은 아닙니다. s and s[0].isdigit()제 생각에는 가독성이 훨씬 떨어집니다. 개인적으로 나는 그 구조를 좋아한다 ... if ... else ... 당신의 발언을 고려하면, 나는 그것을 다음과 같이 개선 할 것입니다 :s[0].isdigit() if s!="" else False
— eyquem

3

놀랍게도 오랜 시간이 지난 후에도 여전히 최고의 답변이 누락되어 있습니다.

다른 답변의 단점은 [0]첫 번째 문자를 선택하는 데 사용 되지만 언급했듯이 빈 문자열에서 끊어집니다.

다음을 사용하면이 문제를 피할 수 있으며, 제 생각에는 옵션 중 가장 예쁘고 읽기 쉬운 구문을 제공합니다. 또한 정규식을 가져 오거나 방해하지 않습니다.)

>>> string = '1abc'
>>> string[:1].isdigit()
True

>>> string = ''
>>> string[:1].isdigit()
False

2

다음을 사용할 수도 있습니다 try...except.

try:
    int(string[0])
    # do your stuff
except:
    pass # or do your stuff

1

여기에 내 "답변"이 있습니다 (여기에서 고유하도록 노력하고 있지만 실제로이 특정 경우에 대해 권장하지 않습니다. :-)

사용 ord () 및특별한 a <= b <= c형태 :

//starts_with_digit = ord('0') <= ord(mystring[0]) <= ord('9')
//I was thinking too much in C. Strings are perfectly comparable.
starts_with_digit = '0' <= mystring[0] <= '9'

(이와 a <= b <= c같이 a < b < c는 특별한 파이썬 구조이며, 비교 1 < 2 < 3(true), 1 < 3 < 2(false), (1 < 3) < 2(true) 와 같이 깔끔 합니다. 이것은 대부분의 다른 언어에서 작동하는 방식이 아닙니다.)

정규식 사용 :

import re
//starts_with_digit = re.match(r"^\d", mystring) is not None
//re.match is already anchored
starts_with_digit = re.match(r"\d", mystring) is not None

1
(1) 패배 ord()(2) ^정규식에서 패배 .
— John Machin

0

정규식을 사용할 수 있습니다 .

다음을 사용하여 숫자를 감지 할 수 있습니다.

if(re.search([0-9], yourstring[:1])):
#do something

[0-9] 파는 모든 숫자와 일치하고 yourstring [: 1]은 문자열의 첫 번째 문자와 일치합니다.



-5

이 시도:

if string[0] in range(10):

이것은 전혀 작동하지 않습니다. range(10)반면, 정수의 목록을 생성하는 string[0]길이 1의 문자열 인
— 페트리 레티 넨

1
작동하지 않습니다. 유형이 일치하지 않습니다. 그러나 : if string[0] in map(str,range(10))작품
— phynfo 2011-04-07
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.