একাধিক শব্দ সীমানা ডিলিমিটার সহ স্ট্রিংগুলিকে শব্দের মধ্যে বিভক্ত করুন


671

আমি মনে করি আমি যা করতে চাই এটি একটি মোটামুটি সাধারণ কাজ তবে ওয়েবে আমি কোনও রেফারেন্স পাইনি। আমার বিরামচিহ্ন সহ পাঠ্য রয়েছে এবং আমি শব্দের একটি তালিকা চাই।

"Hey, you - what are you doing here!?"

হতে হবে

['hey', 'you', 'what', 'are', 'you', 'doing', 'here']

তবে পাইথনের str.split()একমাত্র যুক্তি দিয়ে কাজ করে, তাই আমি সাদা বাক্সে বিভক্ত হওয়ার পরে বিরামচিহ্নের সাথে সমস্ত শব্দ রয়েছে। কোন ধারনা?



6
অজগরটিও str.split()কোনও যুক্তি ছাড়াই কাজ করে
ইভান ভিনোগ্রাডভ

উত্তর:


468

এমন একটি ক্ষেত্রে যেখানে নিয়মিত প্রকাশগুলি ন্যায়সঙ্গত হয়:

import re
DATA = "Hey, you - what are you doing here!?"
print re.findall(r"[\w']+", DATA)
# Prints ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

2
ধন্যবাদ। এখনও আগ্রহী, যদিও - আমি এই মডিউলটিতে ব্যবহৃত অ্যালগরিদম কীভাবে বাস্তবায়ন করতে পারি? এবং কেন এটি স্ট্রিং মডিউলটিতে উপস্থিত হয় না?
আবলু

29
নিয়মিত প্রকাশগুলি প্রথমে ভয়ঙ্কর হতে পারে তবে খুব শক্তিশালী। নিয়মিত এক্সপ্রেশন '\ ডাব্লু +' এর অর্থ "শব্দের অক্ষর (এজ ইত্যাদি) এক বা একাধিকবার পুনরাবৃত্তি হয়েছে"। পাইথন নিয়মিত প্রকাশের এখানে একটি হাওটো
রিচিহাইন্ডল

324
এটি প্রশ্নের উত্তর নয়। এটি একটি পৃথক প্রশ্নের উত্তর, যা এই বিশেষ পরিস্থিতির জন্য কাজ করে। এটি এমনভাবে হয় যে কেউ "আমি কীভাবে বাম বাঁক করব" জিজ্ঞাসা করেছিল এবং শীর্ষ ভোটের উত্তরটি ছিল "পরবর্তী তিনটি ডানদিকে ঘুরুন"। এটি নির্দিষ্ট ছেদগুলির জন্য কাজ করে তবে এটি প্রয়োজনীয় উত্তর দেয় না। হাস্যকরভাবে, উত্তরটি ঠিক আছে re, না findall। নীচে দেওয়া উত্তর re.split()উচ্চতর।
জেসি illিলন

4
@ জেসিহিলন "শব্দের অক্ষরের ক্রমযুক্ত সমস্ত সাবস্ট্রিংগুলি গ্রহণ করুন" এবং "শব্দহীন অক্ষরের ক্রমযুক্ত সমস্ত সাবস্ট্রিংগুলিতে বিভাজন" আক্ষরিকভাবে একই ক্রিয়াকলাপটি প্রকাশের বিভিন্ন উপায়; আমি নিশ্চিত না আপনি কেন উত্তরকে উচ্চতর ডাকবেন।
মার্ক আমেরিকা

4
@ টিএমডাব্লুপি: অ্যাস্টোস্টোফের অর্থ হ'ল এর মতো শব্দটিকে একটি শব্দ don'tহিসাবে বিবেচনা করা হয়, বরং এর মধ্যে বিভক্ত হওয়া donএবং t
রিচিহিন্ডল

574

re.split ()

পুনরায় স্প্লিট (প্যাটার্ন, স্ট্রিং [, ম্যাক্সস্প্লিট = 0])

প্যাটার্নের সংঘটনগুলির দ্বারা স্ট্রিট বিভক্ত করুন। ক্যাপচারিং বন্ধনীগুলি যদি নিদর্শন হিসাবে ব্যবহার করা হয়, তবে প্যাটার্নের সমস্ত গোষ্ঠীর পাঠ্যও ফলাফলের তালিকার অংশ হিসাবে ফিরে আসে। যদি ম্যাক্সস্প্লিট ননজারো হয় তবে সর্বাধিক ম্যাকস্প্লিট বিভক্ত হয় এবং স্ট্রিংয়ের বাকী অংশগুলি তালিকার চূড়ান্ত উপাদান হিসাবে ফিরে আসে। (অসঙ্গতি নোট: মূল পাইথন 1.5 1.5 রিলিজে, ম্যাক্সস্প্লিট উপেক্ষা করা হয়েছিল later এটি পরবর্তী প্রকাশে স্থির করা হয়েছে))

>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('\W+', 'Words, words, words.', 1)
['Words', 'words, words.']

13
এই সমাধানটি খুব সহজেই আন্ডারস্কোরগুলিতে বিভক্ত হওয়ার জন্য খুব সহজেই খাপ খাইয়ে নেওয়ার সুবিধা রয়েছে, যা আবিষ্কারের সমাধানটি কিছু করে না: প্রিন্ট রি.স্প্লিট ("\ ডাব্লু + | _", "এটি_কিছুর টেস্টিং") 'ফলন: [' পরীক্ষা ',' এটি ' , 'জিনিস']
এমিল স্টেনস্ট্রোম

63
এখন শুধুমাত্র আমি যদি এর মধ্যে পার্থক্য মনে রাখতে পারে \w, \W, \s, এবং \S। যে কেউ ভাবল যে কোনও পতনের মূলধনটি তার অর্থকে উল্টে ফেলা উচিত তার মাথার মাধ্যমে গুলি করা দরকার।
আর্টঅফ ওয়ারফেয়ার

1
স্ট্রিং বিভাজনের সাধারণ ব্যবহারের ক্ষেত্রে চূড়ান্ত ফলাফল থেকে খালি স্ট্রিং এন্ট্রি সরিয়ে ফেলা হচ্ছে removing এই পদ্ধতিতে কি এটি করা সম্ভব? পুনঃস্প্লিট ('\ ডাব্লু +', 'এবিসি') এর ফলাফল ['', 'এ', 'বি', 'সি', '']
স্কট মোরকেন

3
@ আর্টঅফ ওয়ারফেয়ার কোনও shiftকিছুর বিপরীতে কীটি ব্যবহার করা সাধারণ । ctrl+zপূর্বাবস্থা বনাম ctrl+shift+zপুনরায় জন্য। সুতরাং shift w, বা W, এর বিপরীত হবে w
ফ্র্যাঙ্ক ভেল

1
এই উত্তরটি শীর্ষে থাকা উচিত - এটি কেবলমাত্র একমাত্র যা সঠিকভাবে প্রশ্নের শিরোনামের উত্তর দেয়।
কানাচ

381

রিজ এক্সপ্যাক ছাড়াই এটি করার আরও একটি দ্রুত উপায় হ'ল অক্ষরের প্রতিস্থাপনটি নীচের মত:

>>> 'a;bcd,ef g'.replace(';',' ').replace(',',' ').split()
['a', 'bcd', 'ef', 'g']

71
দ্রুত এবং নোংরা তবে আমার ক্ষেত্রে উপযুক্ত (আমার বিভাজকগুলি একটি ছোট, পরিচিত সেট ছিল)
অ্যান্ডি বেকার

7
আপনার কাছে আর আর লাইব্রেরিতে অ্যাক্সেস নেই এমন মামলার জন্য উপযুক্ত, যেমন কিছু ছোট ছোট মাইক্রোকন্ট্রোলার। :-)
ইনস্টল করুন মনিকা-ডোর দুহ

11
আমি মনে করি এটি আর এর চেয়েও স্পষ্ট, সুতরাং এটি একরকম বন্ধুত্বপূর্ণ। কখনও কখনও সব কিছুর সাধারণ সমাধানের প্রয়োজন হয় না
অ্যাডাম হিউজ

অসাধারণ. আমার একাধিক ইনপুট পরিস্থিতিতে একটি .স্প্লিট () ছিল এবং যখন ব্যবহারকারী, আমাকে, কমা না দিয়ে একটি স্থান দিয়ে ইনপুটগুলি আলাদা করে ফেলেন তখন তা ধরা দরকার। আমি হাল ছেড়ে দিতে এবং পুনরায় আবৃত্তি করতে চলেছিলাম, তবে আপনার .replace () সমাধানটি মাথায় পেরেকটি আঘাত করেছে। ধন্যবাদ।
জয়জে 123

আপনি ফাঁকা জায়গায় বিভক্ত করতে চান না এবং আপনি অন্য চরিত্রগুলিতে বিভক্ত করতে চান যখন এটি আপনাকে ভুল উত্তর পেয়ে যাবে।
আহমেদ আমর

307

এতগুলি উত্তর, তবুও আমি এমন কোনও সমাধান খুঁজে পাচ্ছি না যা প্রশ্নগুলির শিরোনামটি আক্ষরিকভাবে জিজ্ঞাসা করে যা দক্ষতার সাথে করে (একাধিক সম্ভাব্য বিভাজককে বিভক্ত করে — পরিবর্তে, অনেক উত্তর এমন কোনও শব্দের উপর বিভক্ত হয় যা আলাদা নয়)। সুতরাং এখানে শিরোনামের প্রশ্নের একটি উত্তর, যা পাইথনের মানক এবং দক্ষ reমডিউলের উপর নির্ভর করে :

>>> import re  # Will be splitting on: , <space> - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

কোথায়:

  • […]ম্যাচ এক বিভাজক ভেতরে তালিকাভুক্ত,
  • \-রেগুলার এক্সপ্রেশন মধ্যে বিশেষ ব্যাখ্যা প্রতিরোধ এখানে -যেমন একটি অক্ষর সীমার সূচকটি (হিসাবে A-Z),
  • +ছেড়ে যাওয়া এক বা একাধিক বিভেদক (এটা ধন্যবাদ বাদ দেওয়া যেতে পারেfilter() , কিন্তু এই অকারণে মিলেছে বিভাজক মধ্যে খালি স্ট্রিং উত্পাদন করবে), এবং
  • filter(None, …) শীর্ষস্থানীয় এবং অনুসরণকারী বিভাজক দ্বারা তৈরি করা খালি স্ট্রিংগুলি সরিয়ে দেয় (যেহেতু খালি স্ট্রিংগুলির একটি মিথ্যা বুলিয়ান মান রয়েছে)।

এই re.split()অবিকল, যেমন প্রশ্ন শিরোনামে চাইলেন "একাধিক বিভাজক সঙ্গে টুকরা"।

এই সমাধানটি আরও কিছু সমাধানে পাওয়া শব্দগুলিতে অ-এসসিআইআই অক্ষরগুলির সাথে সমস্যা থেকে সুরক্ষিত রয়েছে ( ঘোস্টডোগ 74৪ এর উত্তরের প্রথম মন্তব্য দেখুন )।

reমডিউল অনেক বেশি দক্ষ (গতি ও সংক্ষিপ্ত রুপ মধ্যে) পাইথন loops এবং পরীক্ষার "হাতে" করছেন বেশি!


3
"আমি এমন কোনও সমাধান খুঁজে পাচ্ছি না যা প্রশ্নগুলির শিরোনামটি আক্ষরিকভাবে জিজ্ঞাসা করে যা দক্ষতার সাথে করে" - দ্বিতীয় উত্তরটি 5 বছর আগে পোস্ট করেছে: stackoverflow.com/a/1059601/2642204
বার্তোসজকেপি

17
এই উত্তরটি ডিলিমিটারগুলিতে বিভক্ত হয় না (একাধিক ডিলিমিটারের সেট থেকে): এটি পরিবর্তে এমন কোনও কিছুতে বিভক্ত হয় যা অক্ষর নয়। এটি বলেছিল, আমি সম্মত হই যে মূল পোস্টারটির উদ্দেশ্য সম্ভবত কিছু বিরাম চিহ্নগুলি সরিয়ে না রেখে কেবল শব্দগুলি রাখা।
এরিক হে লেবিগোট

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

@ গ্র্যাভিটিওয়েল: আমি নিশ্চিত যে আমি বুঝতে পেরেছি না: আপনি কি একটি নিখুঁত উদাহরণ দিতে পারেন?
এরিক হে লেবিগোট

3
@ ইওল: আমি ঠিক বুঝতে পেরেছিলাম যে আপনার মন্তব্যে আমি বিভ্রান্ত হয়ে পড়েছি "এই উত্তরটি বিভক্ত হয় না ..." আমি ভেবেছিলাম "এটি" আপনার পুনঃস্পষ্ট উত্তরটি উল্লেখ করেছে, তবে আমি এখন বুঝতে পেরেছি যে আপনি জিমেলের উত্তর বোঝাতে চেয়েছিলেন। আমি মনে করি এই উত্তরটি (আমি যে মন্তব্যে উত্তর দিচ্ছি) এটি সর্বোত্তম উত্তর :)
গ্রেভিটিওয়েল

56

আরেকটি উপায়, রেগেক্স ছাড়াই

import string
punc = string.punctuation
thestring = "Hey, you - what are you doing here!?"
s = list(thestring)
''.join([o for o in s if not o in punc]).split()

8
এই সমাধানটি গ্রহণযোগ্যটির চেয়ে আসলে ভাল। এটি কোনও এএসসিআইআই অক্ষর নিয়ে কাজ করে না, চেষ্টা করুন "Hey, you - what are you doing here María!?"। পূর্ববর্তী উদাহরণ সহ গৃহীত সমাধানটি কাজ করবে না।
ক্রিস্টোফার রামারেজ

4
আমি মনে করি এখানে একটি ছোট সমস্যা আছে ... আপনার কোডটি এমন অক্ষরগুলিকে সংযোজন করবে যা বিরামচিহ্ন দিয়ে পৃথক করা হয়েছে এবং এভাবে তাদের ভাগ করবে না ... যদি আমি ভুল না হয় তবে আপনার শেষ লাইনটি হওয়া উচিত:''.join([o if not o in string.punctuation else ' ' for o in s]).split()
সিডবেউ

নিয়মিত এক্সপ্রেশন লাইব্রেরি অক্ষরগুলির জন্য ইউনিকোড কনভেনশনগুলি গ্রহণ করার জন্য প্রয়োজনীয় হতে পারে। অতিরিক্ত হিসাবে, এটি গ্রহণযোগ্য সমাধান ব্যবহার করায় একই সমস্যাটি রয়েছে: বর্তমানে যেমন রয়েছে, এটি অ্যাস্টোস্ট্রোফেসে বিভক্ত হয়। আপনি চাইতে পারেন o for o in s if (o in not string.punctuation or o == "'"), তবে যদি আমরা সিডবিউয়ের প্যাচটি যুক্ত করি তবে এটি ওয়ান-লাইনারের পক্ষে খুব জটিল হয়ে উঠছে।
ড্যানিয়েল এইচ

এখানে আরও একটি সমস্যা আছে। এমনকি আমরা @cedbeu এর পরিবর্তনগুলি বিবেচনায় নিলে, স্ট্রিংয়ের মতো কিছু থাকলে এই কোডটি কাজ করে না "First Name,Last Name,Street Address,City,State,Zip Code"এবং আমরা কেবল কমাতে বিভক্ত করতে চাই ,। পছন্দসই আউটপুটটি হবে: ['First Name', 'Last Name', 'Street Address', 'City', 'State', 'Zip Code']পরিবর্তে আমরা কী পাই:['First', 'Name', 'Last', 'Name', 'Street', 'Address', 'City', 'State', 'Zip', 'Code']
স্টেফান ভ্যান ডান আকার

4
এই সমাধানটি মারাত্মকভাবে অক্ষম: প্রথমে তালিকাটি পৃথক অক্ষরগুলিতে বিভক্ত হয়, তারপরে বিরামচিহ্নগুলির সম্পূর্ণ সেটটি মূল স্ট্রিংয়ের প্রতিটি একক অক্ষরের জন্য চলে যায়, তারপরে অক্ষরগুলি আবার একত্রিত হয় এবং তারপরে আবার বিভক্ত হয়। একটি নিয়মিত প্রকাশ-ভিত্তিক সমাধানের তুলনায় এই সমস্ত "আন্দোলন" খুব জটিল, এমনকি যদি কোনও প্রদত্ত অ্যাপ্লিকেশনটিতে গতি বিবেচনা না করে তবে জটিল সমাধানের প্রয়োজন হয় না। যেহেতু reমডিউলটি মানসম্মত এবং উভয় স্বীকৃতি এবং গতি দেয় তাই কেন এটি বন্ধ করা উচিত তা আমি দেখতে পাই না।
এরিক হে লেবিগোট

39

প্রো-টিপ: string.translateপাইথনের দ্রুততম স্ট্রিং ক্রিয়াকলাপগুলির জন্য ব্যবহার করুন ।

কিছু প্রমাণ ...

প্রথমত, ধীর পথ (দুঃখিত pprzemek):

>>> import timeit
>>> S = 'Hey, you - what are you doing here!?'
>>> def my_split(s, seps):
...     res = [s]
...     for sep in seps:
...         s, res = res, []
...         for seq in s:
...             res += seq.split(sep)
...     return res
... 
>>> timeit.Timer('my_split(S, punctuation)', 'from __main__ import S,my_split; from string import punctuation').timeit()
54.65477919578552

পরবর্তী, আমরা ব্যবহার করি re.findall()(প্রস্তাবিত উত্তরের হিসাবে দেওয়া) অনেক দ্রুত:

>>> timeit.Timer('findall(r"\w+", S)', 'from __main__ import S; from re import findall').timeit()
4.194725036621094

শেষ পর্যন্ত, আমরা ব্যবহার translate:

>>> from string import translate,maketrans,punctuation 
>>> T = maketrans(punctuation, ' '*len(punctuation))
>>> timeit.Timer('translate(S, T).split()', 'from __main__ import S,T,translate').timeit()
1.2835021018981934

ব্যাখ্যা:

string.translateসিতে প্রয়োগ করা হয়েছে এবং পাইথনের অনেকগুলি স্ট্রিং ম্যানিপুলেশন ফাংশনগুলির বিপরীতে string.translate নয় নতুন স্ট্রিং উত্পাদন । সুতরাং এটি স্ট্রিং প্রতিস্থাপনের জন্য যত তাড়াতাড়ি পেতে পারেন

এটি কিছুটা বিশ্রী হলেও এটি এই যাদুটি করার জন্য একটি অনুবাদ টেবিলের প্রয়োজন। আপনি maketrans()সুবিধার ফাংশন দিয়ে একটি অনুবাদ টেবিল তৈরি করতে পারেন । এখানে উদ্দেশ্য হ'ল সমস্ত অযাচিত অক্ষরগুলিকে স্পেসে অনুবাদ করা। এক এক জন্য বিকল্প। আবার কোনও নতুন ডেটা তৈরি হয় না। সুতরাং এটি দ্রুত !

পরবর্তী, আমরা ভাল পুরানো ব্যবহার split()split()ডিফল্টরূপে সমস্ত সাদা স্পেস অক্ষরগুলিতে কাজ করবে, বিভাজনের জন্য তাদের একসাথে ভাগ করে নেবে। ফলাফলটি আপনি চান শব্দের তালিকা হবে। এবং এই পদ্ধতির চেয়ে প্রায় 4x দ্রুত re.findall()!


4
আমি এখানে একটি পরীক্ষা করেছি এবং আপনার যদি ইউনিকোড ব্যবহার করার প্রয়োজন হয় patt = re.compile(ur'\w+', re.UNICODE); patt.findall(S)তবে অনুবাদ করার চেয়ে দ্রুততর ব্যবহার করুন , কারণ আপনাকে ট্রান্সফর্ম প্রয়োগের আগে স্ট্রিংটি এনকোড করতে হবে এবং ইউনিকোডে ফিরে যাওয়ার জন্য বিভক্ত হওয়ার পরে তালিকার প্রতিটি আইটেমটি ডিকোড করুন।
রাফায়েল এস কলসাবেরিনী

আপনি অনুবাদ বাস্তবায়নকে এক-লাইন করতে পারেন এবং নিশ্চিত করতে পারেন যে এস এর সাথে বিভক্তদের মধ্যে নেই:s.translate(''.join([(chr(i) if chr(i) not in seps else seps[0]) for i in range(256)])).split(seps[0])
হবস

কেউ নেওয়া হয়নি। আপনি আপেল এবং কমলা তুলনা করছেন। ;) অজগর 3 এ আমার সমাধানটি এখনও কাজ করে; পি এবং মাল্টি-চর বিভাজকের পক্ষে সমর্থন করে। :) একটি নতুন স্ট্রিং বরাদ্দ না করে সহজ পদ্ধতিতে এটি করার চেষ্টা করুন। :) তবে সত্য, আমার কমান্ড লাইন প্যারামগুলি পার্সিংয়ের মধ্যে সীমাবদ্ধ এবং উদাহরণস্বরূপ কোনও বই নয়।
pprzemek

আপনি বলছেন যে "একটি নতুন স্ট্রিং উত্পাদন করে না", এর অর্থ এটি প্রদত্ত স্ট্রিংয়ের অন্তর্ভুক্ত কাজ করে? আমি এটি এখন পাইথন ২.7 দিয়ে পরীক্ষা করেছি এবং এটি অরোগিনাল স্ট্রিংকে পরিবর্তন করে না এবং নতুনটি দেয়।
প্রোকপ হাপালা

26

আমার অনুরূপ দ্বিধা ছিল এবং আমি 'পুনরায়' মডিউলটি ব্যবহার করতে চাইনি।

def my_split(s, seps):
    res = [s]
    for sep in seps:
        s, res = res, []
        for seq in s:
            res += seq.split(sep)
    return res

print my_split('1111  2222 3333;4444,5555;6666', [' ', ';', ','])
['1111', '', '2222', '3333', '4444', '5555', '6666']

1
আমি এই পছন্দ। কেবল একটি নোট, বিভাজকের ক্রমের বিষয়টি গুরুত্বপূর্ণ। দুঃখিত যদি তা স্পষ্ট হয়।
ক্রিজক্রাইগ

2
reমডিউলটি কেন ব্যবহার করবেন না , যা উভয়ই দ্রুত এবং সুস্পষ্ট (নিয়মিত প্রকাশগুলি স্পষ্ট নয়, তবে এটি ছোট এবং প্রত্যক্ষ দিকের কারণে)?
এরিক হে লেবিগোট

13

প্রথমত, আমি অন্যের সাথে একমত হতে চাই যে রেজেক্স বা str.translate(...)ভিত্তিক সমাধানগুলি সর্বাধিক পারফরম্যান্স। আমার ব্যবহারের ক্ষেত্রে এই ফাংশনটির পারফরম্যান্স তাত্পর্যপূর্ণ ছিল না, তাই আমি সেই মানদণ্ডগুলির সাথে বিবেচনা করে এমন ধারণাগুলি যুক্ত করতে চেয়েছিলাম।

আমার মূল লক্ষ্যটি ছিল অন্য কয়েকটি উত্তর থেকে ধারণাগুলিকে সাধারণ সমাধান করা যা কেবলমাত্র রেগেক্স শব্দের চেয়ে বেশি স্ট্রিংগুলির জন্য কাজ করতে পারে (অর্থাত্, বিরামচিহ্ন অক্ষর বনাম শ্বেত তালিকাভুক্ত শব্দের অক্ষরের সুস্পষ্ট উপসেটকে কালো তালিকাভুক্ত করা)।

মনে রাখবেন যে, যে কোনও পদ্ধতির ক্ষেত্রে, string.punctuationএকটি নিজে নিজেই সংজ্ঞায়িত তালিকার জায়গায় ব্যবহার বিবেচনা করতে পারেন ।

বিকল্প 1 - re.sub

আমি এখনও অবধি রি.সউব (...) ব্যবহার করে কোন উত্তর না পেয়ে অবাক হয়েছি । আমি এই সমস্যাটির জন্য এটি একটি সহজ এবং প্রাকৃতিক পদ্ধতি বলে মনে করি।

import re

my_str = "Hey, you - what are you doing here!?"

words = re.split(r'\s+', re.sub(r'[,\-!?]', ' ', my_str).strip())

এই সমাধানে, আমি কলটির re.sub(...)ভিতরে প্রবেশ করলাম re.split(...)- তবে যদি পারফরম্যান্স সমালোচিত হয় তবে বাইরের রেজেক্সকে সংকলন করা উপকারী হতে পারে - আমার ব্যবহারের ক্ষেত্রে, পার্থক্যটি তাত্পর্যপূর্ণ ছিল না, তাই আমি সরলতা এবং পঠনযোগ্যতা পছন্দ করি।

বিকল্প 2 - str.replace

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

my_str = "Hey, you - what are you doing here!?"

replacements = (',', '-', '!', '?')
for r in replacements:
    my_str = my_str.replace(r, ' ')

words = my_str.split()

পরিবর্তে স্ট্রিংয়ের স্ট্রিংরেজকে মানচিত্র তৈরি করতে পেরে ভাল লাগত, তবে আমি মনে করি না যে এটি অপরিবর্তনীয় স্ট্রিং দিয়ে করা সম্ভব হবে এবং অক্ষরের তালিকার বিরুদ্ধে ম্যাপিংয়ের সময় প্রতিটি চরিত্রের বিপরীতে প্রতিস্থাপন চালানো হবে অতিরিক্ত শব্দ। (সম্পাদনা করুন: কার্যকরী উদাহরণের জন্য পরবর্তী বিকল্পটি দেখুন))

বিকল্প 3 - functools.reduce

(পাইথন 2 এ, reduceফান্টুলগুলি থেকে আমদানি না করে বৈশ্বিক নেমস্পেসে উপলব্ধ)

import functools

my_str = "Hey, you - what are you doing here!?"

replacements = (',', '-', '!', '?')
my_str = functools.reduce(lambda s, sep: s.replace(sep, ' '), replacements, my_str)
words = my_str.split()

এইচএম, অন্য একটি পদ্ধতি ব্যবহার করা str.translate- এটি ইউনিকোড-সক্ষম নয় তবে সম্ভবত অন্যান্য পদ্ধতির তুলনায় দ্রুত এবং এটি কিছু ক্ষেত্রে ভাল হতে পারে: replacements=',-!?'; import string; my_str = my_str.translate(string.maketrans(replacements, ' ' * len(replacements)))এছাড়াও এখানে অক্ষরের স্ট্রিং হিসাবে প্রতিস্থাপন করা বাধ্যতামূলক, টিপল বা নয় তালিকা।
মারসফট

@ মারসফট ধন্যবাদ! আমি উত্তরের শীর্ষে একটি উল্লেখ করেছি তবে বিদ্যমান উত্তরগুলি ইতিমধ্যে এটি ভালভাবে আলোচনা করার কারণে এটি যুক্ত না করার সিদ্ধান্ত নিয়েছে।
টেলর এডমিস্টন

10
join = lambda x: sum(x,[])  # a.k.a. flatten1([[1],[2,3],[4]]) -> [1,2,3,4]
# ...alternatively...
join = lambda lists: [x for l in lists for x in l]

তারপরে এটি থ্রি-লাইনারে পরিণত হয়:

fragments = [text]
for token in tokens:
    fragments = join(f.split(token) for f in fragments)

ব্যাখ্যা

হাসকেলে এটিই তালিকা মোনাড হিসাবে পরিচিত। মোনাডের পিছনে ধারণাটি হ'ল একবার "মোনাডে" আপনি "মনাদে থাকুন" যতক্ষণ না কিছু আপনাকে বের করে দেয়। উদাহরণস্বরূপ হাস্কেল, বলে যে আপনি range(n) -> [1,2,...,n]একটি তালিকার উপরে অজগর ফাংশনটি মানচিত্র করুন । যদি ফলাফলটি একটি তালিকা হয় তবে তা স্থানটিতে তালিকার সাথে যুক্ত হবে, সুতরাং আপনি এর মতো কিছু পাবেনmap(range, [3,4,1]) -> [0,1,2,0,1,2,3,0] । এটি মানচিত্র-সংযোজন (বা ম্যাপেন্ড, বা সম্ভবত এর মতো কিছু) নামে পরিচিত। এখানে ধারণাটি হ'ল আপনি এই অপারেশনটি প্রয়োগ করছেন যা আপনি প্রয়োগ করছেন (টোকেনের উপর বিভাজন), এবং যখনই আপনি এটি করেন, আপনি ফলাফলটিকে তালিকায় যোগ দেন।

আপনি এটিকে কোনও ফাংশনে বিমূর্ত করতে এবং tokens=string.punctuationডিফল্টরূপে রাখতে পারেন।

এই পদ্ধতির সুবিধা:

  • এই পদ্ধতির (নিষ্পাপ রেজেক্স-ভিত্তিক পদ্ধতির বিপরীতে) স্বেচ্ছাসেবী-দৈর্ঘ্যের টোকেনগুলি (যা রেজেক্স আরও উন্নত সিন্ট্যাক্সের সাহায্যে করতে পারে) দিয়েও কাজ করতে পারে।
  • আপনি কেবল টোকেনের মধ্যে সীমাবদ্ধ নন; প্রতিটি টোকেনের জায়গায় আপনি নির্বিচারে যুক্তি রাখতে পারেন, উদাহরণস্বরূপ "টোকেন" এর মধ্যে একটি ফাংশন হতে পারে যা নেস্টেড বন্ধনীগুলি অনুসারে বিভক্ত হয়।

ঝরঝরে হাস্কেল সমাধান, তবে আইএমও এটি পাইথনের ম্যাপেন্ড না করে আরও স্পষ্টভাবে লেখা যেতে পারে।
ইম্পালা ভ্লাদ 0

@ গুজ: মূল বক্তব্যটি ছিল যে 2-লাইন ফাংশনটি map_then_appendকোনও সমস্যাটিকে 2-লাইনার তৈরি করতে ব্যবহার করা যেতে পারে, পাশাপাশি আরও অনেক সমস্যা লিখতেও সহজ হয়। অন্যান্য সমাধানগুলির বেশিরভাগই নিয়মিত এক্সপ্রেশন reমডিউল ব্যবহার করেন যা অজগর নয়। তবে যখন আমি সত্যিই সংক্ষিপ্ত হয়ে আমার উত্তরটিকে অযৌক্তিক এবং ফুলে ফেঁপে উঠতে দেখি তাতে আমি অসন্তুষ্ট ছিলাম ... আমি এটি সম্পাদনা করতে যাচ্ছি ...
ninjagecko

লিখিত হিসাবে পাইথনে এটি কাজ করার কথা? আমার fragmentsফলাফলটি স্ট্রিংয়ের অক্ষরের একটি তালিকা (টোকেন সহ)।
রিক

@ রিকটিচি: এটি পাইথন 2 এবং পাইথন 3 উভয় ক্ষেত্রেই আমার পক্ষে কাজ করে।
নিনজাগেকো

Hmmmm। উদাহরণটি কিছুটা অস্পষ্ট হতে পারে। আমি উত্তরে কোড চেষ্টা করেছি থাকার সহ বিভিন্ন ways- সমস্ত প্রকারের fragments = ['the,string'], fragments = 'the,string'অথবা fragments = list('the,string')তাদের কেউ ডান আউটপুট উৎপাদন করা হয়।
রিক

5

এটা চেষ্টা কর:

import re

phrase = "Hey, you - what are you doing here!?"
matches = re.findall('\w+', phrase)
print matches

এটি মুদ্রণ করবে ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']


4

দুইবার প্রতিস্থাপন ব্যবহার করুন:

a = '11223FROM33344INTO33222FROM3344'
a.replace('FROM', ',,,').replace('INTO', ',,,').split(',,,')

ফলাফল স্বরূপ:

['11223', '33344', '33222', '3344']

4

আমি আবার পছন্দ করি তবে এটি ছাড়া আমার সমাধানটি এখানে:

from itertools import groupby
sep = ' ,-!?'
s = "Hey, you - what are you doing here!?"
print [''.join(g) for k, g in groupby(s, sep.__contains__) if not k]

সেপ .__ অন্তর্ভুক্ত__ একটি 'ইন' অপারেটর দ্বারা ব্যবহৃত একটি পদ্ধতি। মূলত এটি হিসাবে একই

lambda ch: ch in sep

তবে এখানে আরও সুবিধাজনক।

গ্রুপবাই আমাদের স্ট্রিং এবং ফাংশন পায়। এটি সেই ফাংশনটি ব্যবহার করে গোষ্ঠীতে স্ট্রিং বিভক্ত হয়: যখনই ফাংশনের মান পরিবর্তিত হয় - একটি নতুন গোষ্ঠী উত্পন্ন হয়। সুতরাং, সেপ .__ এর অন্তর্ভুক্ত__ আমাদের হ'ল প্রয়োজন।

গোষ্ঠীবদ্ধ জোড়গুলির অনুক্রম ফেরত দেয়, যেখানে জুড়ি [0] আমাদের ফাংশনের ফলাফল এবং জুড়ি [1] একটি গোষ্ঠী। 'If not' কে ব্যবহার করে আমরা বিভাজনকারীদের সাথে গোষ্ঠীগুলি ফিল্টার করে থাকি (কারণ সেপের ফলাফল __ এর মধ্যে রয়েছে__ পৃথককারীদের ক্ষেত্রে সত্য)। ঠিক আছে, এগুলি সবই - এখন আমাদের গ্রুপগুলির ক্রম রয়েছে যেখানে প্রত্যেকে একটি শব্দ (গোষ্ঠীটি আসলে একটি পুনরাবৃত্তিযোগ্য তাই আমরা এটিকে স্ট্রিংয়ে রূপান্তর করতে যোগ ব্যবহার করি )।

এই সমাধানটি বেশ সাধারণ, কারণ এটি পৃথক স্ট্রিংয়ের জন্য একটি ফাংশন ব্যবহার করে (আপনার যে কোনও শর্তের দ্বারা আপনি বিভাজন করতে পারেন)। এছাড়া, এটিও অন্তর্বর্তী স্ট্রিং / করণীয় তালিকা তৈরি করে না (আপনি অপসারণ করতে পারেন যোগদানের এবং অভিব্যক্তি অলস হয়ে যাবে, যেহেতু প্রতিটি দলের কোনো ইটারেটরে হয়)


4

একটি পুনরায় মডিউল ফাংশন ব্যবহার করার পরিবর্তে পুনরায় স্প্লিট করুন আপনি পান্ডের সিরিজ.এসটিএসস্প্লিট পদ্ধতি ব্যবহার করে একই ফলাফল অর্জন করতে পারবেন।

প্রথমে উপরের স্ট্রিং দিয়ে একটি সিরিজ তৈরি করুন এবং তারপরে সিরিজটিতে পদ্ধতিটি প্রয়োগ করুন।

thestring = pd.Series("Hey, you - what are you doing here!?") thestring.str.split(pat = ',|-')

প্যারামিটার প্যাট সীমানা গ্রহণকারীকে নেয় এবং বিভাজক স্ট্রিংটিকে অ্যারের হিসাবে প্রদান করে। এখানে দুটি প্রেরককে একটি ব্যবহার করে পাস করা হয়েছে (বা অপারেটর) আউটপুট নিম্নরূপ:

[Hey, you , what are you doing here!?]


1
এটি ভার্চুজের বিষয় নয়, বরং একটি স্ট্রিংকে পান্ডা সিরিজে রূপান্তরিত করার পরে একটি সাধারণ কাজ সম্পাদন করার জন্য একটি সম্পূর্ণ লাইব্রেরি (যা আমি পছন্দ করি, বিটিডাব্লু) আমদানির সত্য। খুব & quot; ওকাম বন্ধুত্বপূর্ণ & quot ;.
zar3bski

3

আমি পাইথনের সাথে নিজেকে পুনরায় পরিচিত করছি এবং একই জিনিসটির প্রয়োজন ছিল। অনুসন্ধানের সমাধানটি আরও ভাল হতে পারে তবে আমি এটি নিয়ে এসেছি:

tokens = [x.strip() for x in data.split(',')]

চতুর, সমস্ত ইংরাজি ব্যাকরণগত কন্সট্রাক্টস নিয়ে কাজ করা উচিত আমি কোনও ফাঁকা জায়গা ছাড়া কোনও এম-ড্যাশ বাদে ভাবতে পারি - এটি উদাহরণস্বরূপ। (
ওয়ার্কারআনেডেবল

3

মেকট্রান্স ব্যবহার করে অনুবাদ করুন আপনি এটি সহজে এবং ঝরঝরে করে করতে পারেন

import string
specials = ',.!?:;"()<>[]#$=-/'
trans = string.maketrans(specials, ' '*len(specials))
body = body.translate(trans)
words = body.strip().split()


3

পাইথন 3-এ, আপনি প্রত্যেকের জন্য পাইথন - পাইথন থেকে পদ্ধতিটি ব্যবহার করতে পারেন ।

আমরা স্ট্রিং পদ্ধতি ব্যবহার করে উভয় এই সমস্যার সমাধান করতে পারে lower, punctuationএবং translatetranslateপদ্ধতি সবচেয়ে সূক্ষ্ম। এখানে ডকুমেন্টেশন রয়েছে translate:

your_string.translate(your_string.maketrans(fromstr, tostr, deletestr))

অক্ষরের fromstrসাথে একই অবস্থানে অক্ষরগুলি প্রতিস্থাপন করুন tostrএবং সমস্ত অক্ষর মুছে ফেলুন deletestrfromstrএবং tostrখালি স্ট্রিং হতে পারে এবং deletestrপ্যারামিটার বাদ দেওয়া যেতে পারে।

আপনি "বিরামচিহ্ন" দেখতে পারেন:

In [10]: import string

In [11]: string.punctuation
Out[11]: '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'  

আপনার উদাহরণের জন্য:

In [12]: your_str = "Hey, you - what are you doing here!?"

In [13]: line = your_str.translate(your_str.maketrans('', '', string.punctuation))

In [14]: line = line.lower()

In [15]: words = line.split()

In [16]: print(words)
['hey', 'you', 'what', 'are', 'you', 'doing', 'here']

আরও তথ্যের জন্য, আপনি উল্লেখ করতে পারেন:


2
স্ট্রিংয়ের অনুবাদ () এবং মেকট্রান্স () পদ্ধতিগুলি আকর্ষণীয় তবে এই পদ্ধতিটি "ডিলিমিটারগুলিতে বিভক্ত" (বা হোয়াইটস্পেস) করতে ব্যর্থ হয়: উদাহরণস্বরূপ, "একটি বড় গুহা-ইন ছিল" তার পরিবর্তে "ক্যাভাইন" শব্দটি তৈরি করবে প্রত্যাশিত "গুহা" এবং "ইন" এর… এইভাবে, প্রশ্নটি যা জিজ্ঞাসা করে তা তা করে না।
এরিক হে লেবিগোট

@ এরিকলিবিগোট যা মন্তব্য করেছেন ঠিক তেমনই। উপরের পদ্ধতিটি প্রশ্নটি যা খুব ভালভাবে জিজ্ঞাসা করে তা করে না।
জেরেমি আনিফ্যাক

2

এটি অর্জনের আরেকটি উপায় হ'ল প্রাকৃতিক ভাষা সরঞ্জাম কিট ( এনল্টেকে ) ব্যবহার করা।

import nltk
data= "Hey, you - what are you doing here!?"
word_tokens = nltk.tokenize.regexp_tokenize(data, r'\w+')
print word_tokens

এই মুদ্রণ: ['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

এই পদ্ধতির বৃহত্তম অপূর্ণতা হ'ল আপনাকে এনল্টেকে প্যাকেজ ইনস্টল করতে হবে

সুবিধাগুলি হ'ল একবার আপনার টোকেনগুলি পাওয়ার পরে আপনি বাকি এনল্টক প্যাকেজটির সাথে প্রচুর মজাদার জিনিসগুলি করতে পারেন।


1

প্রথমত, আমি মনে করি না যে আপনার উদ্দেশ্য হ'ল বিভক্ত কার্যগুলিতে বিরামচিহ্ন হিসাবে বিরামচিহ্নগুলি ব্যবহার করা। আপনার বিবরণটি সুপারিশ করে যে আপনি ফলস্বরূপ স্ট্রিংগুলি থেকে বিরামচিহ্নগুলি কেবল মুছতে চান।

আমি এটি প্রায়শই ঘনিয়ে আসি এবং আমার স্বাভাবিক সমাধানটির পুনরায় দরকার হয় না।

ওয়ান-লাইনার ল্যাম্বদা ফাংশন ডাব্লু / তালিকা উপলব্ধি:

(প্রয়োজন import string):

split_without_punc = lambda text : [word.strip(string.punctuation) for word in 
    text.split() if word.strip(string.punctuation) != '']

# Call function
split_without_punc("Hey, you -- what are you doing?!")
# returns ['Hey', 'you', 'what', 'are', 'you', 'doing']


ফাংশন (প্রচলিত)

একটি traditionalতিহ্যবাহী ফাংশন হিসাবে, এটি তালিকার বোধগম্যতার সাথে কেবলমাত্র দুটি লাইন (এটি ছাড়াও import string):

def split_without_punctuation2(text):

    # Split by whitespace
    words = text.split()

    # Strip punctuation from each word
    return [word.strip(ignore) for word in words if word.strip(ignore) != '']

split_without_punctuation2("Hey, you -- what are you doing?!")
# returns ['Hey', 'you', 'what', 'are', 'you', 'doing']

এটি স্বাভাবিকভাবে সংকোচনের এবং হাইফেনেটেড শব্দগুলিকে অক্ষত রাখবে। text.replace("-", " ")বিভক্ত হওয়ার আগে আপনি হাইফেনগুলি সর্বদা স্পেসে পরিণত করতে ব্যবহার করতে পারেন ।

সাধারণ ফাংশন ডাব্লু / লাম্বদা বা তালিকা সমঝোতা

আরও সাধারণ সমাধানের জন্য (যেখানে আপনি বর্ণগুলি বাদ দিতে নির্দিষ্ট করতে পারেন) এবং কোনও তালিকা বোঝা ছাড়াই আপনি পাবেন:

def split_without(text: str, ignore: str) -> list:

    # Split by whitespace
    split_string = text.split()

    # Strip any characters in the ignore string, and ignore empty strings
    words = []
    for word in split_string:
        word = word.strip(ignore)
        if word != '':
            words.append(word)

    return words

# Situation-specific call to general function
import string
final_text = split_without("Hey, you - what are you doing?!", string.punctuation)
# returns ['Hey', 'you', 'what', 'are', 'you', 'doing']

অবশ্যই, আপনি সর্বদা ল্যাম্বডা ফাংশনটিকে কোনও নির্দিষ্ট বর্ণের অক্ষরেও সাধারণ করতে পারেন।


1

প্রথমত, কোনও লুপে কোনও রেজিএক্স ক্রিয়াকলাপ সম্পাদনের আগে সর্বদা re.compile () ব্যবহার করুন কারণ এটি সাধারণ অপারেশনের চেয়ে দ্রুত কাজ করে।

সুতরাং আপনার সমস্যার জন্য প্রথমে প্যাটার্নটি সংকলন করুন এবং তারপরে এটি সম্পাদন করুন।

import re
DATA = "Hey, you - what are you doing here!?"
reg_tok = re.compile("[\w']+")
print reg_tok.findall(DATA)

1

এখানে কিছু ব্যাখ্যা সহ উত্তর দেওয়া হল।

st = "Hey, you - what are you doing here!?"

# replace all the non alpha-numeric with space and then join.
new_string = ''.join([x.replace(x, ' ') if not x.isalnum() else x for x in st])
# output of new_string
'Hey  you  what are you doing here  '

# str.split() will remove all the empty string if separator is not provided
new_list = new_string.split()

# output of new_list
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

# we can join it to get a complete string without any non alpha-numeric character
' '.join(new_list)
# output
'Hey you what are you doing'

বা একটি লাইনে আমরা এটি করতে পারি:

(''.join([x.replace(x, ' ') if not x.isalnum() else x for x in st])).split()

# output
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

আপডেট উত্তর


1

একটি ফাংশন তৈরি করুন যা ইনপুট হিসাবে দুটি স্ট্রিং নেয় (উত্সের স্ট্রিংকে বিভক্ত করতে হবে এবং বিভক্তকারীদের বিভক্ত তালিকার স্ট্রিং) এবং বিভক্ত শব্দের একটি তালিকা আউটপুট করে:

def split_string(source, splitlist):
    output = []  # output list of cleaned words
    atsplit = True
    for char in source:
        if char in splitlist:
            atsplit = True
        else:
            if atsplit:
                output.append(char)  # append new word after split
                atsplit = False
            else: 
                output[-1] = output[-1] + char  # continue copying characters until next split
    return output

1

আমি পিপ্রজেমেকের সমাধানটি পছন্দ করি কারণ এটি অনুমান করে না যে ডিলিমিটরগুলি একক অক্ষর এবং এটি একটি রেইজেক্স লাভ করার চেষ্টা করে না (যা বিভাজকের সংখ্যা দীর্ঘ দীর্ঘ হতে পারে তবে এটি ভাল কাজ করবে না)।

এখানে স্পষ্টতার জন্য উপরের সমাধানটির আরও পাঠযোগ্য সংস্করণ:

def split_string_on_multiple_separators(input_string, separators):
    buffer = [input_string]
    for sep in separators:
        strings = buffer
        buffer = []  # reset the buffer
        for s in strings:
            buffer = buffer + s.split(sep)

    return buffer

0

@oooooo এর মতোই সমস্যাটি পেয়েছে এবং এই বিষয়টিকে খুঁজে পান @ ghostdog74 আমাকে অনুপ্রাণিত করেছে, সম্ভবত কেউ আমার সমাধানটি কার্যকর দেখতে পেয়েছে

str1='adj:sg:nom:m1.m2.m3:pos'
splitat=':.'
''.join([ s if s not in splitat else ' ' for s in str1]).split()

স্পেস প্লেসে কিছু ইনপুট করুন এবং একই অক্ষর ব্যবহার করে বিভক্ত করুন যদি আপনি ফাঁকা জায়গায় বিভক্ত করতে চান না।


আমি কি শব্দ ব্যবহার করে বিভক্ত করতে হবে?
হর্ষ বিয়ানি

0

একাধিক সীমানা বিচ্ছেদকারীদের সাথে বিভক্ত হয়ে এখানে আমার:

def msplit( str, delims ):
  w = ''
  for z in str:
    if z not in delims:
        w += z
    else:
        if len(w) > 0 :
            yield w
        w = ''
  if len(w) > 0 :
    yield w

0

আমি মনে করি আপনার প্রয়োজনীয়তা স্যুট করার জন্য নিম্নলিখিতটি সর্বোত্তম উত্তর:

\W+ সম্ভবত এই ক্ষেত্রে উপযুক্ত, কিন্তু অন্যান্য ক্ষেত্রে উপযুক্ত হতে পারে না।

filter(None, re.compile('[ |,|\-|!|?]').split( "Hey, you - what are you doing here!?")

আমি সম্মত, সমাধান \wএবং \Wসমাধানগুলি প্রশ্নের (শিরোনাম) কোনও উত্তর নয়। মনে রাখবেন যে আপনার উত্তরে, |অপসারণ করা উচিত (আপনি expr0|expr1পরিবর্তে তার কথা ভাবছেন [char0 char1…])। তদুপরি, compile()নিয়মিত প্রকাশের প্রয়োজন নেই is
এরিক হে লেবিগোট

0

এটি আমার গ্রহণ ...

def split_string(source,splitlist):
    splits = frozenset(splitlist)
    l = []
    s1 = ""
    for c in source:
        if c in splits:
            if s1:
                l.append(s1)
                s1 = ""
        else:
            print s1
            s1 = s1 + c
    if s1:
        l.append(s1)
    return l

>>>out = split_string("First Name,Last Name,Street Address,City,State,Zip Code",",")
>>>print out
>>>['First Name', 'Last Name', 'Street Address', 'City', 'State', 'Zip Code']

0

আমি replace()সবচেয়ে ভাল উপায়। নিম্নলিখিত পদ্ধতিটি একটি স্ট্রিং-এ সংজ্ঞায়িত সমস্ত বিভাজককে splitlistপ্রথম বিভাজকটিতে পরিবর্তন করে splitlistএবং তারপরে সেই এক বিভাজকের পাঠ্যকে বিভক্ত করে। এটি যদি splitlistখালি স্ট্রিং হয়ে থাকে তবে এটির জন্য অ্যাকাউন্টও accounts এটি শব্দের একটি তালিকা দেয়, এতে কোনও খালি স্ট্রিং নেই।

def split_string(text, splitlist):
    for sep in splitlist:
        text = text.replace(sep, splitlist[0])
    return filter(None, text.split(splitlist[0])) if splitlist else [text]

0
def get_words(s):
    l = []
    w = ''
    for c in s.lower():
        if c in '-!?,. ':
            if w != '': 
                l.append(w)
            w = ''
        else:
            w = w + c
    if w != '': 
        l.append(w)
    return l

এখানে ব্যবহার:

>>> s = "Hey, you - what are you doing here!?"
>>> print get_words(s)
['hey', 'you', 'what', 'are', 'you', 'doing', 'here']

0

আপনি যদি একটি বিপরীতমুখী অপারেশন চান (ডিলিমিটার সংরক্ষণ করুন), আপনি এই ফাংশনটি ব্যবহার করতে পারেন:

def tokenizeSentence_Reversible(sentence):
    setOfDelimiters = ['.', ' ', ',', '*', ';', '!']
    listOfTokens = [sentence]

    for delimiter in setOfDelimiters:
        newListOfTokens = []
        for ind, token in enumerate(listOfTokens):
            ll = [([delimiter, w] if ind > 0 else [w]) for ind, w in enumerate(token.split(delimiter))]
            listOfTokens = [item for sublist in ll for item in sublist] # flattens.
            listOfTokens = filter(None, listOfTokens) # Removes empty tokens: ''
            newListOfTokens.extend(listOfTokens)

        listOfTokens = newListOfTokens

    return listOfTokens

0

আমার সম্প্রতি এটি করার দরকার ছিল তবে একটি ফাংশন চেয়েছিলাম যা কিছুটা স্ট্যান্ডার্ড লাইব্রেরি str.splitফাংশনের সাথে মেলে , 0 বা 1 টি আর্গুমেন্টের সাথে ডাকা হলে এই ফাংশনটি স্ট্যান্ডার্ড লাইব্রেরির মতোই আচরণ করে।

def split_many(string, *separators):
    if len(separators) == 0:
        return string.split()
    if len(separators) > 1:
        table = {
            ord(separator): ord(separator[0])
            for separator in separators
        }
        string = string.translate(table)
    return string.split(separators[0])

দ্রষ্টব্য : এই ফাংশনটি কেবল তখনই কার্যকর যখন আপনার বিভাজকগুলিতে একটি একক অক্ষর থাকে (যেমনটি আমার ইউজকেসটি ছিল)।

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