文字列がPythonで数字で始まるかどうかを見分ける方法は?


91

数字(0〜9)で始まる文字列がありますstartswith()を使用して10個のテストケースを「または」できることはわかっていますが、おそらくより適切な解決策があります

だから書く代わりに

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書かれているように、あなたの質問は、1桁だけで始まる文字列を検出したいという意味です。もしそうであれば、次のようなものの中で唯一の正しい答え、使用したものではありませんs[0]か、s[:1]しかし、ジョン・マチンのソリューション:if s.startswith(tuple('0123456789'))。さらに、このソリューションでは、sがタプルやリストのようなシーケンスである場合にエラーが発生します。この場合、文字列であるかのように同じ結果が生成されます。-別の解決策は、パターンが'\ d(?= \ D)'である正規表現ですが、ここでは正規表現の使用は不要です。
eyquem 2011

3
ただ衒学者であること:stringは標準ライブラリのモジュールであり、おそらく変数名として使用すべきではありません。docs.python.org/2/library/string.html
GAK

回答:


170

Pythonのstringライブラリには次のisdigit()メソッドがあります。

string[0].isdigit()

5
Python2のstring モジュールにはメソッドがなく、オブジェクトのisdigitメソッドです。strunicode
ジョンマチン2011

3
@plaes:-1上記のプラスのため、s == ""の場合はクラッシュします
John Machin

3
:空の文字列のために中断されません私の答えを見てstring[:1].isdigit()
PascalVKooten

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

私はPythonの人ではないので、おそらくあなたはこれについて私を助けることができます:この関数は「」に爆弾を投下しstring[0]ますか?
corsiKa 2011

うん、それは確かになります。(stringまたは 'x')[0] .isdigit()を使用して、 ''またはNoneを修正できます
jcomeau_ictx 2011

30
string[:1].isdigit()空の文字列を処理して終了する、を試すことができます。
サイモンカラン2011

2
それは私の答えではないからです。プログラマーが空の文字列に例外をスローしたい場合は、私の方がさらに優れています。
jcomeau_ictx 2015年

1
@jcomeau_ictxは正確に正しい。決して防御的にプログラムしないでください。文字列が予期せず空白の場合、それはすべきアウトエラーと自動的とにかく扱われるべきではありません。一部の学派は、警告として重要ではない例外を適切に処理してキャッチし、プログラムを続行する必要があると述べています。私はほとんどのユースケースでこの考え方を持っていません。作成する関数とコードの特異性は、防御的により頻繁にコーディングする必要があるエッジケースを軽減するのに役立ちます。
jamescampbell 2017

10

時々、正規表現を使用できます

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

やり過ぎ!bultinsでそれができるのになぜreを使うのか
Jakob Bowyer

1
@JakobBowyer少なくとも、それについて知っておくのは良いことです!この場合でも、はい、一部のビルトインが同じことを実行できる場合、正規表現はやり過ぎです。
jeromej 2013

8

コードは機能しません。のor代わりに必要です||

試してみてください

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

または

strg[:1] in '0123456789'

または、あなたが本当に夢中ならstartswith

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

startwith(タプル)使用したソリューションしかない場合は、賛成票を投じたでしょう。しかし、とのソリューションは、strg[:1]場合、彼らはエラーは発生しません:2つの不便を持っているのは、文字列のリストであることを起こるかもしれない、と彼らは生産真の文字列は、いくつかの数字で始まる場合。
eyquem 2011

@eyquem文字列が数桁で始まる場合、Trueを生成します。他の文字が数値でないことをチェックする必要がなかったため、他の回答はそれをチェックしません。
ロブ・グラント

夢中にstartswithなっていて、コードにこのように実装しました。ありがとうございました。
jamescampbell 2016年

もう1つは可能性から始まります...– 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 2011

1
@ジョンマチン「醜い」とはどういう意味ですか?読めない?上記のあなたの提案がもっと読みやすいとは思いません。s and s[0].isdigit()私の意見ではさらに読みにくいです。個人的に、私は構成が好きです... if ... else ...あなたの発言を考慮して、私はそれを次のように改善します:s[0].isdigit() if s!="" else False
eyquem 2011

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に、特別なPython構造であり、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)^正規表現で失う。
ジョンマチン2011

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の文字列である
ペトリLehtinenの

1
それは機能しません。タイプが一致しません。しかし:if string[0] in map(str,range(10))動作します
phynfo 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.