স্ট্রিংয়ে একটি নম্বর রয়েছে কিনা তা পরীক্ষা করুন


194

বেশিরভাগ প্রশ্নের আমি খুঁজে পেয়েছি যে তারা তাদের সংখ্যায় অক্ষর সন্ধান করছে এই বিষয়ে পক্ষপাতদুষ্ট, আমি যে সংখ্যাগুলিতে চেয়েছি তাতে আমি কী সংখ্যা চাইছি। আমাকে একটি স্ট্রিং প্রবেশ করতে হবে এবং এটিতে কোনও নম্বর রয়েছে কিনা তা পরীক্ষা করে দেখতে হবে এবং এটি এটি প্রত্যাখ্যান করে কিনা।

সমস্ত অক্ষরের সংখ্যা হলে ফাংশনটি isdigit()কেবল ফিরে আসে True। আমি কেবল দেখতে চাই যে ব্যবহারকারী কোনও সংখ্যায় প্রবেশ করেছে কিনা এমন একটি বাক্য "I own 1 dog"বা কিছু something

কোন ধারনা?

উত্তর:


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
@ থেফোর্তে: -1 এখনও একটি অঙ্ক। এটি একটি ড্যাশ, এর পরে অঙ্ক '1'
ব্যবহারকারীর 183018

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

রেফ: https://docs.python.org/2/library/stdtypes.html#str.isalpha

স্ট্রিংয়ের সমস্ত অক্ষর বর্ণানুক্রমিক এবং কমপক্ষে একটি অক্ষর থাকলে অন্যথায় মিথ্যা হলে সত্যটি প্রত্যাবর্তন করুন।


8
বর্ণমালা এবং সংখ্যাসূচক বর্ণ ছাড়াও অন্যান্য ধরণের অক্ষর রয়েছে - যেমন, '_'.isalpha()মিথ্যা।
lvc

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 (স্ট্রিং): res = RE_D.search (স্ট্রিং) রিটার্ন রেজিস রেস কিছু নয়
রাউল

8

আপনি স্ট্রিংয়ের প্রতিটি চরিত্রের উপর ফাংশন isdigit () প্রয়োগ করতে পারেন। অথবা আপনি নিয়মিত ভাব প্রকাশ করতে পারেন।

এছাড়াও আমি পাই আমি পাইথনে একটি স্ট্রিংয়ে কীভাবে একটি নম্বর পাই? সংখ্যাগুলি ফেরত দেওয়ার জন্য খুব উপযুক্ত উপায়ে। নীচের সমাধানটি সেই প্রশ্নের উত্তর থেকে।

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

বিকল্পভাবে:

number = filter(str.isdigit, yourString)

আরও তথ্যের জন্য রিজেক্স ডকুমেন্টটি একবার দেখুন: http://docs.python.org/2/library/re.html

সম্পাদনা: এটি প্রকৃত সংখ্যাগুলি ফিরিয়ে দেয়, বুলিয়ান মান নয়, সুতরাং উপরের উত্তরগুলি আপনার ক্ষেত্রে আরও সঠিক are

প্রথম পদ্ধতিটি প্রথম অঙ্ক এবং পরবর্তীকালের পরপর সংখ্যাগুলি প্রদান করবে। এভাবে 1.56 ডলার হিসাবে 1. 10,000 হিসাবে ফেরত আসবে। 1020 হিসাবে ফিরে আসবে 0207-100-1000 0207 হিসাবে ফিরে আসবে।

দ্বিতীয় পদ্ধতিটি কাজ করে না।

সমস্ত অঙ্ক, বিন্দু এবং কমা নিষ্কাশন করতে, এবং অবিচ্ছিন্ন অঙ্কটি না হারাতে ব্যবহার করুন:

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

3

আপনি এটির জন্য NLTK পদ্ধতিটি ব্যবহার করতে পারেন।

এটি পাঠ্যে '1' এবং 'এক' উভয়ই খুঁজে পাবেন:

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

আমি অবাক হয়েছি যে এই সমন্বয়ের কথা কেউ উল্লেখ করেনি 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
দয়া করে এখানে আপনার উত্স কোডটি নিক্ষেপ করবেন না। সুন্দর হোন এবং আপনার উত্তরের একটি সুন্দর বর্ণনা দেওয়ার চেষ্টা করুন, যাতে অন্যরা এটি পছন্দ করে এবং এটির উন্নতি করতে পারে। দেখুন: আমি কীভাবে ভাল উত্তর লিখব?
সুনুন ןɐ কিউপি

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
স্ট্যাক ওভারফ্লোতে স্বাগতম! দয়া করে এখানে আপনার উত্স কোডটি নিক্ষেপ করবেন না। সুন্দর হোন এবং আপনার উত্তরের একটি সুন্দর বর্ণনা দেওয়ার চেষ্টা করুন, যাতে অন্যরা এটি পছন্দ করে এবং এটির উন্নতি করতে পারে। দেখুন: আমি কীভাবে ভাল উত্তর লিখব?
সুনুন ןɐ কিউপি

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 এটি আরও ভাল কারণ এটি সি ভাষায় শর্ট সার্কিট এক্সপ্রেশনের মতো কাজ করে এবং ফলাফল নির্ধারণের সাথে সাথেই ফলাফলটি ফিরে আসবে যেমন স্ট্রিংয়ের ক্ষেত্রে 'a1bbbbbbc' 'b এর' সি'র তুলনাও করা হবে না।

  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"), যা মনে হচ্ছে যা আমি খুঁজছিলাম!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.