文字列に数字が含まれているかどうかを確認する


193

私が見つけた質問のほとんどは、彼らが数字で文字を探しているという事実に偏っていますが、私は無数の文字列になりたいもので数字を探しています。文字列を入力して、数字が含まれているかどうか、拒否されているかどうかを確認する必要があります。

関数isdigit()True、すべての文字が数字の場合にのみ戻ります。ユーザーが数字などを入力したかどうかを確認したいだけです"I own 1 dog"

何か案は?

回答:


291

このようにanystr.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その後、正規表現は次のように拡張することができますr'-?\d+'
thefourtheye

15
とにかく、元の正規表現は負の数を検出しませんか?
confused00

1
@ confused00いいえ、\d範囲0からまでの1桁のみに一致し9ます。
thefourtheye

9
@thefourtheye:-1はまだ数字です。ダッシュとそれに続く数字「1」
user3183018

49

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 2013年

30

使用する

str.isalpha() 

参照:https : //docs.python.org/2/library/stdtypes.html#str.isalpha

文字列のすべての文字がアルファベットで、少なくとも1つの文字がある場合はtrueを返し、それ以外の場合はfalseを返します。


8
アルファベットと数字以外の文字の他の種類があります-例えば、'_'.isalpha()Falseです。
lvc 2015年

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は何も
返さ

これは、一致がないことを意味し、それが返されますNone
zyxue

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

8

文字列のすべての文字に関数isdigit()を適用できます。または、正規表現を使用することもできます。

また、Pythonで文字列内の1つの数値を検索するにはどうすればよいですか?非常に適切な方法で数値を返します。以下の解決策は、その質問の答えからです。

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として返されます。

2番目の方法は機能しません。

すべての数字、ドット、およびカンマを抽出し、連続しない数字を失わないようにするには、次を使用します。

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

rangeをcountと一緒に使用して、範囲と照合することにより、文字列に数値が出現する回数を確認できます。

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

Iは、誰が、この組み合わせをmentionnedていないことに驚いていますanymap

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

python 3ではおそらくおそらく最も高速です(おそらく正規表現を除いて)それはループを含まないためです(そして関数のエイリアスはそれを調べないようにします str)。)。

短絡を壊すをmap返すので、Python 2 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
Stack Overflowへようこそ!ここにソースコードを投げないでください。他の人がそれを気に入って賛成できるように、素敵にして、あなたの答えに素敵な説明を与えるようにしてください。参照:良い回答を書くにはどうすればよいですか?
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ループを使用することで、このイベントを保証しています。


回答に説明を追加してください
マスティサ

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

これはおそらくPythonでの最良のアプローチではありませんが、Haskellerとしては、このラムダ/マップアプローチは完全に理に適っており、非常に短いものです。

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

もちろん名前を付ける必要はありません。という名前を付けてanydigit("abc123")、私が探していたもののように感じます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.