Controleer of een tekenreeks een cijfer

Meestal van de vragen die ik heb gevonden, zijn bevooroordeeld op het feit dat ze op zoek zijn naar letters in hun cijfers, terwijl ik op zoek ben naar nummers in wat ik zou willen zijn een grenzenloze string.
Ik moet een tekenreeks invoeren en controleren of deze alle nummers bevat en als het dit wel afwijst.

De functie isdigit()retourneert alleen TrueAls alle tekens getallen zijn. Ik wil alleen maar zien of de gebruiker een nummer heeft ingevoerd, dus een zin als "I own 1 dog"of iets.

alle ideeën?


Antwoord 1, Autoriteit 100%

U kunt anygebruiken Functie, met de str.isdigitFunctie, zoals deze

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

U kunt ook een reguliere uitdrukking gebruiken, zoals deze

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

Antwoord 2, Autoriteit 17%

U kunt een combinatie van anyen str.isdigit:

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

De functie retourneert TrueAls een cijfer in de tekenreeks bestaat, anders False.

Demo:

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

Antwoord 3, Autoriteit 10%

Gebruik

Str.IsalPha () 

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

Terugkeren als alle tekens in de string alfabetisch zijn en daar
is ten minste één teken, onwaar anders.


Antwoord 4, Autoriteit 8%

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

U moet een reguliere expressie beter gebruiken. Het is veel sneller.

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

Antwoord 5, Autoriteit 3%

U kunt de functie isdigit () op elk personage in de tekenreeks toepassen. Of u kunt reguliere uitdrukkingen gebruiken.

Ik vond ook Hoe vind ik één nummer in een string in Python? met zeer geschikte manieren om nummers terug te sturen. De onderstaande oplossing is van het antwoord in die vraag.

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

Alternatief:

number = filter(str.isdigit, yourString)

Neem voor meer informatie een kijkje op de regex docu: http: // docs. python.org/2/Library/re.html

EDIT: Dit retourneert de werkelijke getallen, geen Booleaanse waarde, dus de bovenstaande antwoorden zijn correcter voor uw zaak

De eerste methode retourneert het eerste cijfer en de daaropvolgende opeenvolgende cijfers. Zo wordt 1.56 geretourneerd als 1. 10.000 wordt geretourneerd als 10. 0207-100-1000 wordt geretourneerd als 0207.

De tweede methode werkt niet.

om alle cijfers, stippen en komma’s te extraheren en niet-opeenvolgende cijfers te verliezen, gebruikt u:

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

Antwoord 6

U kunt dit als volgt bereiken:

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

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

Gebruik .isdigit()Betekent ook , geen toevlucht te nemen tot een uitzonderingsbehandeling (probeer / behalve) in gevallen waarin u lijst van begrip moet gebruiken (try / behalve is niet mogelijk in een lijstbegrip).


Antwoord 7

U kunt hiervoor de NLTK-methode gebruiken.

Dit vindt zowel ‘1’ als ‘One’ in de tekst:

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

Antwoord 8

Je kunt bereik met aantal gebruiken om te controleren hoe vaak een getal in de tekenreeks voorkomt door het te vergelijken met het bereik:

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

Antwoord 9

Het verbaast me dat niemand deze combinatie van anyen mapheeft genoemd:

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

in python 3 is het waarschijnlijk de snelste daar (behalve misschien voor regexes) omdat het geen lus bevat (en door de functie een alias te geven, wordt voorkomen dat het wordt opgezocht in str).

Gebruik dat niet in python 2 omdat mapeen listretourneert, die anykortsluiting verbreekt


Antwoord 10

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)

Deze code genereert een reeks met de grootte n die ten minste een hoofdletter, kleine letter en een cijfer bevat. Door de while-lus te gebruiken, hebben we deze gebeurtenis gegarandeerd.


Antwoord 11

anyen ordkunnen worden gecombineerd om het onderstaande doel te dienen.

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

Een paar punten over deze implementatie.

  1. anyis beter omdat het werkt als een kortsluitingsuitdrukking in C-taal en het resultaat zal retourneren zodra het kan worden bepaald, dwz in het geval van string ‘a1bbbbbbc’ ‘b’s en ‘c’s’ wordt niet eens vergeleken.

  2. ordis beter omdat het meer flexibiliteit biedt, zoals alleen chequenummers tussen ‘0’ en ‘5’ of een ander bereik. Als u bijvoorbeeld een validator zou schrijven voor de hexadecimale weergave van getallen, zou u willen dat tekenreeksen alleen alfabetten hebben in het bereik ‘A’ tot ‘F’.


Antwoord 12

En deze?

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

Antwoord 13

Ik zal het @zyxue een beetje explicieter maken:

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

Wat is de oplossing met de snelste benchmark uit de oplossingen die @zyxue voorstelde op het antwoord.


Antwoord 14

Dit is waarschijnlijk niet de beste benadering in Python, maar als een haskeller maakte deze lambda / kaartbenadering volkomen logisch voor mij en is het erg kort:

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

hoeven natuurlijk niet te worden genoemd. Genoemd kan worden gebruikt als anydigit("abc123"), die voelt als wat ik op zoek was!


Antwoord 15

Eenvoudigere manier om op te lossen is als

s = '1dfss3sw235fsf7s'
count = 0
temp = list(s)
for item in temp:
    if(item.isdigit()):
        count = count + 1
    else:
        pass
print count

Antwoord 16

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)

Hierdoor wordt alle tekenreeks aangetroffen die beide alfabetten als cijfers erin hebben. isalpha () retourneert de tekenreeks met alle cijfers of alle tekens.


Antwoord 17

ook dit zal werken.

if any(i.isdigit() for i in s):
    print("True")

Antwoord 18

U kunt ook regex findall gebruiken. Het is een meer algemene oplossing omdat het meer controle geeft over de lengte van het nummer. Het kan handig zijn in gevallen waarin u een nummer met een minimale lengte nodig heeft.

s = '67389kjsdk' 
contains_digit = len(re.findall('\d+', s)) > 0

Other episodes