it-swarm.com.de

Prüfen Sie, ob eine Zeichenfolge eine Zahl enthält

Die meisten Fragen, die ich gefunden habe, sind voreingenommen mit der Tatsache, dass sie nach Buchstaben in ihren Zahlen suchen, während ich nach Zahlen in einer Nummer suche, die ich gerne als zahllose Zeichenfolge verwenden möchte string und prüfen Sie, ob es Zahlen enthält und ob es diese ablehnt.

Die Funktion isdigit() gibt nur True zurück, wenn ALLE Zeichen Zeichen sind. Ich möchte nur sehen, ob der Benutzer eine Zahl eingegeben hat, also einen Satz wie "Ich besitze 1 Hund" oder so etwas.

Irgendwelche Ideen?

130
JamesDonnelly

Sie können die Funktion any mit der Funktion str.isdigit so verwenden

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

Alternativ können Sie einen regulären Ausdruck wie diesen verwenden

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

Sie können eine Kombination aus any und str.isdigit verwenden:

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

Die Funktion gibt True zurück, wenn eine Ziffer in der Zeichenfolge vorhanden ist, andernfalls False.

Demo:

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

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

Sie sollten besser reguläre Ausdrücke verwenden. Es ist viel schneller.

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
22
zyxue

benutzen 

str.isalpha () 

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

Gibt true zurück, wenn alle Zeichen in der Zeichenfolge alphabetisch sind und dort ist mindestens ein Zeichen, sonst falsch.

16
K246

Sie können die Funktion isdigit () auf jedes Zeichen im String anwenden. Oder Sie können reguläre Ausdrücke verwenden.

Ich habe auch gefunden Wie finde ich eine Zahl in einem String in Python? mit sehr geeigneten Möglichkeiten, Zahlen zurückzugeben. Die Lösung unten ist aus der Antwort in dieser Frage.

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

Alternative:

number = filter(str.isdigit, yourString)

Weitere Informationen finden Sie in der Regex-Dokumentation: http://docs.python.org/2/library/re.html

Bearbeiten: Dies gibt die tatsächlichen Zahlen zurück, nicht einen booleschen Wert. Die obigen Antworten sind daher für Ihren Fall richtiger

Die erste Methode gibt die erste Ziffer und die nachfolgenden aufeinanderfolgenden Ziffern zurück. Daher wird 1,56 als 1 zurückgegeben. 10.000 werden als 10 zurückgegeben. 0207-100-1000 wird als 0207 zurückgegeben. 

Die zweite Methode funktioniert nicht.

Um alle Ziffern, Punkte und Kommas zu extrahieren und nicht aufeinander folgende Ziffern zu verlieren, verwenden Sie:

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

Was ist mit diesem?

import string

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

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

Sie können dies wie folgt erreichen:

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

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

Die Verwendung von .isdigit() bedeutet auch es muss nicht auf die Ausnahmebehandlung zurückgegriffen werden (try/except) in Fällen, in denen Sie Listenverständnis verwenden müssen (try/außer ist innerhalb eines Listenverständnisses nicht möglich).

1
olisteadman

Sie können range mit count verwenden, um zu überprüfen, wie oft eine Zahl in der Zeichenfolge angezeigt wird, indem Sie sie mit dem Bereich vergleichen:

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
1
pedmindset

Sie können die NLTK-Methode dafür verwenden.

Dies wird sowohl '1' als auch 'Eins' im Text finden:

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.')
1

Einfacher zu lösen ist wie

s = '1dfss3sw235fsf7s'
count = 0
temp = list(s)
for item in temp:
    if(item.isdigit()):
        count = count + 1
    else:
        pass
print count
0
BlizZard
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)

Dieser Code erzeugt eine Sequenz mit der Größe n, die mindestens einen Großbuchstaben, einen Kleinbuchstaben und eine Ziffer enthält. Mit der while-Schleife haben wir dieses Ereignis garantiert. 

0
Mehran Attar

Ich bin überrascht, dass niemand diese Kombination von any und map erwähnt hat:

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

in Python 3 ist es wahrscheinlich das schnellste (außer vielleicht für reguläre Ausdrücke), weil es keine Schleife enthält (und Aliasing der Funktion vermeidet das Nachschlagen in str). 

Verwenden Sie das nicht in Python 2, da map eine list zurückgibt, die einen any-Kurzschluss unterbricht

any und ord können kombiniert werden, um den unten gezeigten Zweck zu erfüllen.

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

Ein paar Punkte zu dieser Implementierung.

  1. any ist besser, weil es wie ein Kurzschlussausdruck in C-Sprache funktioniert und das Ergebnis zurückgibt, sobald es bestimmt werden kann, d. H. Im Fall der Zeichenfolge 'a1bbbbbbc' werden bs und 'cs nicht einmal verglichen.

  2. ord ist besser, weil es mehr Flexibilität bietet, z. B. nur Schecknummern zwischen '0' und '5' oder einem anderen Bereich. Wenn Sie beispielsweise einen Validator für die hexadezimale Darstellung von Zahlen schreiben, möchten Sie, dass Zeichenfolgen nur Buchstaben im Bereich von 'A' bis 'F' enthalten.

0
ViFI