পাইথনের স্ট্রিং থেকে সমস্ত অ-সংখ্যাযুক্ত অক্ষর মুছে ফেলা হচ্ছে


উত্তর:



88

এটি সবচেয়ে কার্যকর উপায় কিনা তা নিশ্চিত নয় তবে:

>>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'

''.joinঅংশ মানে মধ্যে যে কোন অক্ষর ছাড়া একসঙ্গে সব ফলে অক্ষর একত্রিত করতে হবে। তারপরে এটির বাকি অংশগুলি একটি তালিকা উপলব্ধি, যেখানে (আপনি সম্ভবত অনুমান করতে পারেন) আমরা কেবল স্ট্রিংয়ের অংশগুলি গ্রহণ করি যা শর্তের সাথে মেলে isdigit


1
যে বিপরীত না। আমার মনে হয় আপনার অর্থ "সি সিডিজিট ()" নয়
রায়ান আর রোজারিও

7
সমস্ত অ-সংখ্যাসূচকটি সরান == কেবলমাত্র সংখ্যা রাখুন।
মার্ক রুশাকফ

10
আমি পছন্দ করি যে এই সাধারণ ফাংশনের জন্য এই পদ্ধতির পুনরায় টানা দরকার নেই।
ত্রিউণক্ষেত্র

নোট করুন যে স্ট্রিং ট্রান্সলেট ব্যবহার করে বাস্তবায়নগুলির বিপরীতে, এই দ্রবণটি পাইথন ২.7 এবং ৩.৪ উভয় ক্ষেত্রেই কাজ করে। ধন্যবাদ!
অ্যালেক্স

1
আমি এই বিকল্প পছন্দ। একটি রেজেক্স ব্যবহার করা আমার কাছে অত্যধিক কিল মনে হয়।
আলফ্রেডকম্বের

18

এটি পাইথন 2 এ স্ট্রিং এবং ইউনিকোড উভয় পদার্থ এবং পাইথন 3-এ উভয় স্ট্রিং এবং বাইটের জন্য কাজ করা উচিত:

# python <3.0
def only_numerics(seq):
    return filter(type(seq).isdigit, seq)

# python ≥3.0
def only_numerics(seq):
    seq_type= type(seq)
    return seq_type().join(filter(seq_type.isdigit, seq))

9

মিক্সটিতে কেবল অন্য বিকল্প যুক্ত করতে stringমডিউলটিতে বেশ কয়েকটি দরকারী ধ্রুবক রয়েছে । অন্যান্য ক্ষেত্রে আরও কার্যকর হলেও এগুলি এখানে ব্যবহার করা যেতে পারে।

>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'

মডিউলটিতে বেশ কয়েকটি ধ্রুবক রয়েছে যার মধ্যে রয়েছে:

  • ascii_letters (AbcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)
  • hexdigits (0123456789abcdefABCDEF)

আপনি যদি এই ধ্রুবকগুলি ভারীভাবে ব্যবহার করেন তবে এগুলিকে একটি এটিকে গোপন করা সার্থক হতে পারে frozenset। এটি ও (1) অনুসন্ধানগুলি সক্ষম করে ও (এন) এর পরিবর্তে, যেখানে n মূল স্ট্রিংগুলির জন্য ধ্রুবকের দৈর্ঘ্য।

>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'

'' .জাইন (সি এর জন্য "abc123def456" যদি c.isdigit ()) আমার অজগর 3.4 এ কাজ করে
Eino Mäkitalo

7

@ নেড ব্যাচেল্ডার এবং @ নিউভ্যাক্ট সঠিক উত্তরটি সরবরাহ করেছেন, তবে ...

আপনার স্ট্রিংয়ে যদি কমা (,) দশমিক (।) থাকে কেবল তেমন ক্ষেত্রে:

import re
re.sub("[^\d\.]", "", "$1,999,888.77")
'1999888.77'

5

দ্রুততম পদ্ধতির, যদি আপনাকে কেবল এইরকম এক বা দু'টি অপসারণ অপারেশন (বা কেবলমাত্র একটি, তবে একটি দীর্ঘ দীর্ঘ স্ট্রিংয়ের উপর! -) প্রয়োজন হয়, তার জন্য translateস্ট্রিংয়ের পদ্ধতির উপর নির্ভর করতে হবে যদিও এর জন্য কিছু প্রস্তুতি প্রয়োজন:

>>> import string
>>> allchars = ''.join(chr(i) for i in xrange(256))
>>> identity = string.maketrans('', '')
>>> nondigits = allchars.translate(identity, string.digits)
>>> s = 'abc123def456'
>>> s.translate(identity, nondigits)
'123456'

translateপদ্ধতি বিভিন্ন হয়তো একটি বাচ্চা ব্যবহারের সহজ সহজ, এবং, ইউনিকোড স্ট্রিং উপর তুলনায় এটি বাইট স্ট্রিং চালু থাকে, তখন BTW:

>>> unondig = dict.fromkeys(xrange(65536))
>>> for x in string.digits: del unondig[ord(x)]
... 
>>> s = u'abc123def456'
>>> s.translate(unondig)
u'123456'

আপনি প্রকৃত ডিকের পরিবর্তে ম্যাপিং ক্লাসটি ব্যবহার করতে চাইতে পারেন, বিশেষত যদি আপনার ইউনিকোড স্ট্রিংয়ে খুব উচ্চ আদেশের মান থাকতে পারে (এটি ডিকটি অত্যধিক আকারে বড় করে তোলে ;-))। উদাহরণ স্বরূপ:

>>> class keeponly(object):
...   def __init__(self, keep): 
...     self.keep = set(ord(c) for c in keep)
...   def __getitem__(self, key):
...     if key in self.keep:
...       return key
...     return None
... 
>>> s.translate(keeponly(string.digits))
u'123456'
>>> 

2
(1) হার্ড-কোড যাদু নম্বরগুলি না; s / 65536 / sys.maxunicode / (2) ডিকটি নিঃশর্তভাবে "অত্যধিক বড়" কারণ ইনপুটটিতে "সম্ভাব্যভাবে" (sys.maxunicode - number_of_non_numeric_chars)এন্ট্রি থাকতে পারে । ()) স্ট্রিং.ডিজিটগুলি ইউনিকোডেডাটা মডিউলটি ফাটানোর প্রয়োজনীয়তার পক্ষে পর্যাপ্ত পরিমাণে নাও রয়েছে কিনা তা বিবেচনা করুন (৪) সরলতা এবং সম্ভাবনার জন্য রি.সুব (আর '(? ইউ) \ ডি +', ইউ ', টেক্সট) বিবেচনা করুন গতি.
জন মাচিন

2

অনেকগুলি সঠিক উত্তর তবে আপনি রেজিেক্স ব্যবহার না করে সরাসরি ফ্লোটে এটি চান:

x= '$123.45M'

float(''.join(c for c in x if (c.isdigit() or c =='.'))

123,45

আপনার প্রয়োজনের উপর নির্ভর করে আপনি কমাটির জন্য পয়েন্টটি পরিবর্তন করতে পারেন।

আপনি যদি জানেন যে আপনার নম্বরটি পূর্ণসংখ্যা হয় তবে এর জন্য পরিবর্তন করুন

x='$1123'    
int(''.join(c for c in x if c.isdigit())

1123

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