जांचें कि क्या किसी स्ट्रिंग में एक संख्या है


194

मेरे द्वारा पाए गए अधिकांश प्रश्न इस तथ्य पर पक्षपाती हैं कि वे अपनी संख्या में अक्षरों की तलाश कर रहे हैं, जबकि मैं उन संख्याओं की तलाश कर रहा हूं जो मैं एक संख्याहीन स्ट्रिंग बनना चाहता हूं। मुझे एक स्ट्रिंग दर्ज करने और यह देखने के लिए जांचने की आवश्यकता है कि क्या इसमें कोई संख्या है और यदि यह इसे अस्वीकार करता है।

फ़ंक्शन isdigit()केवल तभी लौटाता है Trueजब सभी वर्ण संख्याएँ हों। मैं केवल यह देखना चाहता हूं कि क्या उपयोगकर्ता ने एक संख्या दर्ज की है जैसे कि "I own 1 dog"कुछ या कुछ।

कोई विचार?

जवाबों:


292

आप anyफ़ंक्शन का उपयोग कर सकते हैं , फ़ंक्शन के साथ str.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

नकारात्मक संख्याओं के बारे में क्या?
रे

@ रे फिर RegEx को इस तरह बढ़ाया जा सकता हैr'-?\d+'
Thefourtheye

15
क्या मूल रेगेक्स वैसे भी नकारात्मक संख्याओं का पता नहीं लगाएगा?
उलझन

1
@ confused00 नहीं, \dरेंज में केवल एक ही अंकों से मिलान करेगा 0करने के लिए 9
thefourtheye

9
@thefourtheye: -1 अभी भी एक अंक है। यह एक डैश है, इसके बाद अंक '1'
user3183018

50

आप के संयोजन का उपयोग कर सकते हैं 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

एक अस्थायी सूची बनाने की आवश्यकता नहीं है, आप केवल उन चौकोर कोष्ठकों को हटाकर एक जनरेटर अभिव्यक्ति का उपयोग कर सकते हैं।
मट्टियो इतालिया

आह, बस एहसास है कि anyजनरेटर के भाव को स्वीकार करता है।
एकिड

30

उपयोग

str.isalpha () 

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

यदि स्ट्रिंग में सभी वर्ण अल्फ़ाबेटिक हैं और सही है, तो कम से कम एक वर्ण है, अन्यथा सही लौटें।


8
वर्ण और संख्यात्मक की तुलना में अन्य प्रकार के वर्ण हैं - जैसे, '_'.isalpha()गलत है।
पीवीसी

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 कुछ भी नहीं लौटा रहा है
pyd

इसका मतलब है कि कोई मैच नहीं है, यह रिटर्न करता हैNone
zyxue

RE_D = re.compile ('\ d') def has_digits (string): res = RE_D.search (string) return res नहीं है
राउल

8

आप स्ट्रिंग में प्रत्येक वर्ण पर फ़ंक्शन .digit () लागू कर सकते हैं। या आप नियमित अभिव्यक्ति का उपयोग कर सकते हैं।

मैंने यह भी पाया कि पायथन में एक स्ट्रिंग में मुझे एक नंबर कैसे मिल सकता है? संख्या वापस करने के लिए बहुत ही उपयुक्त तरीकों के साथ। नीचे दिए गए समाधान उस प्रश्न के उत्तर से है।

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

वैकल्पिक रूप से:

number = filter(str.isdigit, yourString)

अधिक जानकारी के लिए regex पर एक नज़र डालें: http://docs.python.org/2/library/re.html

संपादित करें: यह वास्तविक संख्या देता है, बूलियन मान नहीं, इसलिए आपके मामले के लिए ऊपर दिए गए उत्तर अधिक सही हैं

पहली विधि पहले अंक और बाद में लगातार अंक लौटाएगी। इस प्रकार १.५६ को १.१०,००० के रूप में लौटा दिया जाएगा।

दूसरी विधि काम नहीं करती है।

सभी अंकों, बिंदुओं और अल्पविरामों को निकालने के लिए, और गैर-लगातार अंकों को न खोएं, उपयोग करें:

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

3

आप इसके लिए एनएलटीके विधि का उपयोग कर सकते हैं।

इससे पाठ में '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

आप इसे इस प्रकार पूरा कर सकते हैं:

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

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

उपयोग करने .isdigit()का मतलब उन मामलों में अपवाद हैंडलिंग (कोशिश / अपवाद) का सहारा नहीं लेना है, जहां आपको सूची समझ का उपयोग करने की आवश्यकता है (सूची समझ के अंदर प्रयास करना / छोड़कर संभव नहीं है)।


2

आप गणना के साथ रेंज का उपयोग यह जांचने के लिए कर सकते हैं कि रेंज में संख्या कितनी बार स्ट्रिंग में दिखाई देती है:

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

मैं हैरान हूँ कि कोई के इस संयोजन mentionned anyऔर map:

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

अजगर 3 में यह शायद वहां सबसे तेज है (शायद रेगीक्स को छोड़कर) क्योंकि इसमें कोई लूप नहीं होता है (और फ़ंक्शन को अलियास करने से यह देखने से बचता है str)।

अजगर 2 में mapरिटर्न ए के रूप में उपयोग न करें 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
ढेर अतिप्रवाह में आपका स्वागत है! कृपया अपने स्रोत कोड को यहां न फेंके। अच्छा बनो और अपने उत्तर को एक अच्छा विवरण देने की कोशिश करो, ताकि दूसरे इसे पसंद करें और इसे बढ़ाएँ। देखें: मैं एक अच्छा जवाब कैसे लिखूं?
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 के साथ एक अनुक्रम उत्पन्न करता है जिसमें कम से कम एक अपरकेस, लोअरकेस और एक अंक होता है। लूप का उपयोग करके, हमने इस घटना की गारंटी दी है।


कृपया अपने उत्तर में स्पष्टीकरण जोड़ें
मास्टिसा

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 Language में शॉर्ट सर्किट एक्सप्रेशन की तरह काम करता है और जैसे ही इसे 'a1bbbbbc' 'b' और 'c' की तुलना में भी नहीं किया जाएगा, के परिणाम के रूप में जल्द से जल्द निर्धारित किया जाएगा।

  2. ordबेहतर है क्योंकि यह केवल '0' और '5' या किसी अन्य सीमा के बीच चेक संख्याओं को अधिक लचीलापन प्रदान करता है। उदाहरण के लिए यदि आप संख्याओं के हेक्साडेसिमल प्रतिनिधित्व के लिए एक सत्यापनकर्ता लिखना चाहते थे, तो आप केवल 'ए' रेंज में 'एफ' के लिए अक्षर रखना चाहेंगे।


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

यह शायद पायथन में सबसे अच्छा तरीका नहीं है, लेकिन एक हास्केलर के रूप में इस मेमने / नक्शे के दृष्टिकोण ने मेरे लिए सही अर्थ बनाया है और यह बहुत ही कम है:

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

नाम रखने की जरूरत नहीं है। नाम दिया गया इसका उपयोग किया जा सकता है anydigit("abc123"), जो महसूस करता है कि मैं क्या देख रहा था!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.