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


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.