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 True
Als 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 any
gebruiken Functie, met de str.isdigit
Functie, 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 any
en str.isdigit
:
def num_there(s):
return any(i.isdigit() for i in s)
De functie retourneert True
Als 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 any
en map
heeft 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 map
een list
retourneert, die any
kortsluiting 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
any
en ord
kunnen 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.
-
any
is 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. -
ord
is 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