উত্তর:
আপনি যদি কেবলমাত্র ইতিবাচক পূর্ণসংখ্যার নিষ্কাশন করতে চান তবে নিম্নলিখিতগুলি চেষ্টা করুন:
>>> str = "h3110 23 cat 444.4 rabbit 11 2 dog"
>>> [int(s) for s in str.split() if s.isdigit()]
[23, 11, 2]
আমি যুক্তি দিয়ে বলব যে তিনটি কারণে এটি রেগেক্স উদাহরণের চেয়ে ভাল। প্রথমত, আপনার আর একটি মডিউল প্রয়োজন হবে না; দ্বিতীয়ত, এটি আরও পঠনযোগ্য কারণ আপনার রেজিেক্স মিনি-ভাষা পার্স করার দরকার নেই; এবং তৃতীয়ত, এটি দ্রুত (এবং সম্ভবত আরও পাইথোনিক):
python -m timeit -s "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "[s for s in str.split() if s.isdigit()]"
100 loops, best of 3: 2.84 msec per loop
python -m timeit -s "import re" "str = 'h3110 23 cat 444.4 rabbit 11 2 dog' * 1000" "re.findall('\\b\\d+\\b', str)"
100 loops, best of 3: 5.66 msec per loop
এটি ভাসা, নেতিবাচক পূর্ণসংখ্যা বা হেক্সাডেসিমাল ফর্ম্যাটে পূর্ণসংখ্যাকে চিনতে পারবে না। আপনি যদি এই সীমাবদ্ধতাগুলি গ্রহণ করতে না পারেন তবে নীচে স্লিমের উত্তরটি কৌশলটি করবে।
re
। এটি একটি সাধারণ এবং শক্তিশালী সরঞ্জাম (যাতে আপনি খুব দরকারী কিছু শিখেন)। লগ পার্সিংয়ে গতি কিছুটা অপ্রাসঙ্গিক (এটি সর্বোপরি কোনও নিবিড় সংখ্যাসূচক সমাধানকারী নয়), re
মডিউলটি পাইথন লাইব্রেরিতে রয়েছে এবং এটি লোড করতে ক্ষতি করে না।
mumblejumble45mumblejumble
যেখানে আমি জানতাম যে কেবল একটি সংখ্যা রয়েছে। সমাধানটি সহজভাবে int(filter(str.isdigit, your_string))
।
str
যা এরপরে str
বেস পাইথনে বস্তু এবং পদ্ধতিটিকে ওভাররাইড করে । স্ক্রিপ্ট পরে আপনার এটি প্রয়োজন হতে পারে, কারণ এটি ভাল অনুশীলন নয়।
int(filter(...))
TypeError: int() argument must be a string...
পাইথন 3.5 এর জন্য উত্থাপন করবে , যাতে আপনি আপডেট সংস্করণ ব্যবহার করতে পারেন: int(''.join(filter(str.isdigit, your_string)))
সমস্ত সংখ্যাকে একক পূর্ণসংখ্যায় বের করার জন্য।
আমি একটি regexp ব্যবহার করব:
>>> import re
>>> re.findall(r'\d+', 'hello 42 I\'m a 32 string 30')
['42', '32', '30']
এই থেকে 42 মেলে দিবে bla42bla
। আপনি যদি কেবলমাত্র শব্দের সীমানা (স্পেস, পিরিয়ড, কমা) দ্বারা সীমাবদ্ধ সংখ্যা চান তবে আপনি \ বি ব্যবহার করতে পারেন:
>>> re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string 30')
['42', '32', '30']
স্ট্রিংগুলির তালিকার পরিবর্তে সংখ্যার তালিকা দিয়ে শেষ করতে:
>>> [int(s) for s in re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string 30')]
[42, 32, 30]
int
এবং আপনার কাজ শেষ। +1 বিশেষ করে পরবর্তী অংশের জন্য। r'\b\d+\b' == '\\b\\d+\\b'
যদিও আমি কাঁচা স্ট্রিং ( ) পরামর্শ দিই ।
int_list = [int(s) for s in re.findall('\\d+', 'hello 12 hi 89')]
map
।
এটি কিছুটা দেরির চেয়ে বেশি তবে আপনি বৈজ্ঞানিক স্বরলিপি হিসাবে অ্যাকাউন্টে রেজেক্স এক্সপ্রেশনটি প্রসারিত করতে পারেন।
import re
# Format is [(<string>, <expected output>), ...]
ss = [("apple-12.34 ba33na fanc-14.23e-2yapple+45e5+67.56E+3",
['-12.34', '33', '-14.23e-2', '+45e5', '+67.56E+3']),
('hello X42 I\'m a Y-32.35 string Z30',
['42', '-32.35', '30']),
('he33llo 42 I\'m a 32 string -30',
['33', '42', '32', '-30']),
('h3110 23 cat 444.4 rabbit 11 2 dog',
['3110', '23', '444.4', '11', '2']),
('hello 12 hi 89',
['12', '89']),
('4',
['4']),
('I like 74,600 commas not,500',
['74,600', '500']),
('I like bad math 1+2=.001',
['1', '+2', '.001'])]
for s, r in ss:
rr = re.findall("[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?", s)
if rr == r:
print('GOOD')
else:
print('WRONG', rr, 'should be', r)
সব ভাল দেয়!
অতিরিক্তভাবে, আপনি অ্যাডাব্লুএস গ্লু অন্তর্নির্মিত রেজেক্সে দেখতে পারেন
s = "4"
কোন সমস্যা আছে তা সন্ধান করুন যেমন কোনও মিল নেই। এটিকে যত্ন নেওয়ার জন্য কি পুনরায় সম্পাদনা করা যেতে পারে?
[+-]?\d*[\.]?\d*(?:(?:[eE])[+-]?\d+)?
এই গোষ্ঠীটি কিছু মিথ্যা ধনাত্মকতা দেয় (অর্থাত্ +
কখনও কখনও নিজেই এটি ধরা পড়ে) তবে এটি আরও ফর্মগুলি পরিচালনা করতে সক্ষম হয়, যেমন .001
এটি স্বয়ংক্রিয়ভাবে সংখ্যার সংমিশ্রণ করে না (যেমন পছন্দ করে s=2+1
)
[-+]?[.]?[\d]+(?:,\d\d\d)*[\.]?\d*(?:[eE][-+]?\d+)?
- আমার এত নির্বোধ ... আমি কীভাবে এটি ভাবতে পারি না?
আমি ধরে নিচ্ছি যে আপনি কেবল পূর্ণসংখ্যা নয় ভাসমান চান তাই আমি এরকম কিছু করব:
l = []
for t in s.split():
try:
l.append(float(t))
except ValueError:
pass
মনে রাখবেন যে এখানে পোস্ট করা অন্যান্য কয়েকটি সমাধান নেতিবাচক সংখ্যার সাথে কাজ করে না:
>>> re.findall(r'\b\d+\b', 'he33llo 42 I\'m a 32 string -30')
['42', '32', '30']
>>> '-3'.isdigit()
False
float
করুন int
।
re.findall("[-\d]+", "1 -2")
continue
পরিবর্তে লিখলে কি কোনও পার্থক্য রয়েছে pass
?
যদি আপনি জানেন তবে এটি স্ট্রিংয়ের কেবল একটি নম্বর হবে, অর্থাত 'হ্যালো 12 হাই', আপনি ফিল্টারটি চেষ্টা করতে পারেন।
উদাহরণ স্বরূপ:
In [1]: int(''.join(filter(str.isdigit, '200 grams')))
Out[1]: 200
In [2]: int(''.join(filter(str.isdigit, 'Counters: 55')))
Out[2]: 55
In [3]: int(''.join(filter(str.isdigit, 'more than 23 times')))
Out[3]: 23
তবে সাবধান! :
In [4]: int(''.join(filter(str.isdigit, '200 grams 5')))
Out[4]: 2005
TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter'
- এটি ব্যবহার করে এটি ঠিক করেছিলামint("".join(filter(str.isdigit, '200 grams')))
# extract numbers from garbage string:
s = '12//n,_@#$%3.14kjlw0xdadfackvj1.6e-19&*ghn334'
newstr = ''.join((ch if ch in '0123456789.-e' else ' ') for ch in s)
listOfNumbers = [float(i) for i in newstr.split()]
print(listOfNumbers)
[12.0, 3.14, 0.0, 1.6e-19, 334.0]
নীচে রেজেক্স ব্যবহার করার উপায়
lines = "hello 12 hi 89"
import re
output = []
#repl_str = re.compile('\d+.?\d*')
repl_str = re.compile('^\d+$')
#t = r'\d+.?\d*'
line = lines.split()
for word in line:
match = re.search(repl_str, word)
if match:
output.append(float(match.group()))
print (output)
সন্ধানের সাথে
re.findall(r'\d+', "hello 12 hi 89")
['12', '89']
re.findall(r'\b\d+\b', "hello 12 hi 89 33F AC 777")
['12', '89', '777']
findall()
repl_str = re.compile('\d+.?\d*')
হওয়া উচিত: repl_str = re.compile('\d+\.?\d*')
পাইথন re.search(re.compile(r'\d+.?\d*'), "42G").group()
3.7 '42 জি' re.search(re.compile(r'\d+\.?\d*'), "42G").group()
'42' ব্যবহার করে পুনরুত্পাদনযোগ্য উদাহরণের জন্য
line2 = "hello 12 hi 89"
temp1 = re.findall(r'\d+', line2) # through regular expression
res2 = list(map(int, temp1))
print(res2)
ওহে ,
আপনি ফাইন্ডল এক্সপ্রেশন ব্যবহার করে অঙ্কের মাধ্যমে স্ট্রিংয়ের সমস্ত সংখ্যার সন্ধান করতে পারেন।
দ্বিতীয় ধাপে একটি তালিকা পুনরায় তৈরি করুন 2 এবং এই তালিকায় স্ট্রিংয়ে পাওয়া অঙ্কগুলি যুক্ত করুন
আশাকরি এটা সাহায্য করবে
শুভেচ্ছা, দিবাকর শর্মা
সংখ্যাটি স্ট্রিংয়ে ভাসমান অবস্থায় এই উত্তরটিতেও কেস থাকে
def get_first_nbr_from_str(input_str):
'''
:param input_str: strings that contains digit and words
:return: the number extracted from the input_str
demo:
'ab324.23.123xyz': 324.23
'.5abc44': 0.5
'''
if not input_str and not isinstance(input_str, str):
return 0
out_number = ''
for ele in input_str:
if (ele == '.' and '.' not in out_number) or ele.isdigit():
out_number += ele
elif out_number:
break
return float(out_number)
আমি অবাক হয়ে দেখলাম যে এখনও কেউ এ itertools.groupby
অর্জনের বিকল্প হিসাবে ব্যবহারের কথা উল্লেখ করেনি ।
স্ট্রিং থেকে সংখ্যাগুলি বের করার জন্য আপনি itertools.groupby()
পাশাপাশি ব্যবহার করতে পারেন str.isdigit()
:
from itertools import groupby
my_str = "hello 12 hi 89"
l = [int(''.join(i)) for is_digit, i in groupby(my_str, str.isdigit) if is_digit]
মানটি হোল্ড হ'ল l
:
[12, 89]
পিএস: এটি কেবল উদাহরণ হিসাবে দেখানোর জন্য যে বিকল্প হিসাবে আমরা এটি groupby
অর্জনের জন্যও ব্যবহার করতে পারি। তবে এটি কোনও প্রস্তাবিত সমাধান নয়। আপনি যদি এটি অর্জন করতে চান তবে আপনার উচিত ফিল্টার হিসাবে তালিকা বোধগম্যতার উপর ভিত্তি করে ফর্মের স্বীকৃত উত্তরটি ব্যবহার করা str.isdigit
।
বিভিন্ন নিদর্শন ধরতে এটি বিভিন্ন নিদর্শনগুলির সাথে ক্যোয়ারী সহায়ক।
'[\ ঘ] [।, \ ঘ]'
'[\ ঘ] * [।] [\ ঘ]'
'[\ ঘ]'
(দ্রষ্টব্য: প্রথমে জটিল নিদর্শনগুলি রাখুন অন্য সাধারণ সরল নিদর্শনগুলি পূর্ণ ক্যাচে ফিরে আসা জটিল ক্যাচের পরিবর্তে জটিল ক্যাচের অংশগুলি ফিরিয়ে দেবে)।
p = '[\d]+[.,\d]+|[\d]*[.][\d]+|[\d]+'
নীচে, আমরা একটি প্যাটার্ন উপস্থিত রয়েছে তা নিশ্চিত করব re.search()
, তারপরে ক্যাচের একটি পুনরাবৃত্ত তালিকাটি ফিরিয়ে দেব । পরিশেষে, আমরা ম্যাচ অবজেক্ট থেকে ম্যাচ অবজেক্টের রিটার্ন মানটি সাবলেট করতে বন্ধনী স্বরলিপি ব্যবহার করে প্রতিটি ক্যাপ মুদ্রণ করব।
s = 'he33llo 42 I\'m a 32 string 30 444.4 12,001'
if re.search(p, s) is not None:
for catch in re.finditer(p, s):
print(catch[0]) # catch is a match object
রিটার্নস:
33
42
32
30
444.4
12,001
যেহেতু এগুলির কোনওই আমার সন্ধানের জন্য প্রয়োজনীয় এক্সেল এবং শব্দ ডক্সে বাস্তব বিশ্বের আর্থিক সংখ্যার সাথে ডিল করেনি, তাই এখানে আমার প্রকরণ রয়েছে। এটি ইনটস, ফ্লোটস, নেতিবাচক সংখ্যাগুলি, মুদ্রার নম্বরগুলি পরিচালনা করে (কারণ এটি বিভাজনে জবাব দেয় না), এবং দশমিক অংশটি ফেলে দেয় এবং কেবল ইনটগুলি ফিরিয়ে দেয়, বা সবকিছু ফিরিয়ে দেয়।
এটি ইন্ডিয়ান লাক্স নম্বর সিস্টেম পরিচালনা করে যেখানে কমাগুলি অনিয়মিতভাবে উপস্থিত হয়, প্রতি 3 নম্বর পৃথক করে না।
এটি বৈজ্ঞানিক স্বরলিপি বা হস্তান্তর করে না বাজেটের মধ্যে প্রথম বন্ধনীর ভিতরে রাখা negativeণাত্মক সংখ্যা - ইতিবাচক প্রদর্শিত হবে।
এটি খেজুরও বের করে না। স্ট্রিংগুলিতে তারিখগুলি খুঁজে পাওয়ার আরও ভাল উপায় রয়েছে।
import re
def find_numbers(string, ints=True):
numexp = re.compile(r'[-]?\d[\d,]*[\.]?[\d{2}]*') #optional - in front
numbers = numexp.findall(string)
numbers = [x.replace(',','') for x in numbers]
if ints is True:
return [int(x.replace(',','').split('.')[0]) for x in numbers]
else:
return numbers
@ জেমনস, আপনার উত্তরটি আমি পছন্দ করেছি, তবে এটি ভাসমান খুঁজে পাওয়া যায় নি। আমি একটি সিএনসি মিলে কোড পার্স করার জন্য একটি স্ক্রিপ্টে কাজ করছি এবং এক্স এবং ওয়াই উভয় মাত্রার সন্ধান করতে হবে যা পূর্ণসংখ্যা বা ভাসমান হতে পারে, তাই আমি আপনার কোডটি নীচের সাথে মানিয়ে নিয়েছি। এটি ইতিবাচক এবং নেতিবাচক ভ্যালসগুলি সহ ভেসে বেড়াচ্ছে। এখনও হেক্স ফর্ম্যাট করা মানগুলি খুঁজে পাওয়া যায় না তবে আপনি "এক্স" এবং "এ" num_char
টিপলের সাথে "এফ" এর মাধ্যমে যুক্ত করতে পারেন এবং আমার মনে হয় এটি '0x23AC' এর মতো জিনিসগুলি বিশ্লেষণ করবে।
s = 'hello X42 I\'m a Y-32.35 string Z30'
xy = ("X", "Y")
num_char = (".", "+", "-")
l = []
tokens = s.split()
for token in tokens:
if token.startswith(xy):
num = ""
for char in token:
# print(char)
if char.isdigit() or (char in num_char):
num = num + char
try:
l.append(float(num))
except ValueError:
pass
print(l)
আমি খুঁজে পেয়েছি সেরা বিকল্প নীচে। এটি একটি সংখ্যা বের করবে এবং যে কোনও ধরণের চরকে নির্মূল করতে পারে।
def extract_nbr(input_str):
if input_str is None or input_str == '':
return 0
out_number = ''
for ele in input_str:
if ele.isdigit():
out_number += ele
return float(out_number)
ফোন নম্বরগুলির জন্য আপনি কেবলমাত্র রেজিজেটে \ ডি সহ সমস্ত অ-অঙ্কের অক্ষর বাদ দিতে পারেন:
import re
phone_number = '(619) 459-3635'
phone_number = re.sub(r"\D", "", phone_number)
print(phone_number)