এখানে কি পাইথন ফাংশন রয়েছে যা একটি স্ট্রিং থেকে হোয়াইটস্পেস (স্পেস এবং ট্যাব) ট্রিম করবে?
উদাহরণ: \t example string\t
→example string
string.whitespace
।
এখানে কি পাইথন ফাংশন রয়েছে যা একটি স্ট্রিং থেকে হোয়াইটস্পেস (স্পেস এবং ট্যাব) ট্রিম করবে?
উদাহরণ: \t example string\t
→example string
string.whitespace
।
উত্তর:
উভয় পক্ষের সাদা স্থান:
s = " \t a string example\t "
s = s.strip()
ডানদিকে সাদা স্থান:
s = s.rstrip()
বাম দিকে সাদা স্থান:
s = s.lstrip()
যেহেতু thedz নির্দেশ করে, আপনি এই জাতীয় ফাংশনগুলির যেকোন একটিতে স্বেচ্ছাচারী অক্ষরগুলি ছাঁটাই করার জন্য একটি যুক্তি সরবরাহ করতে পারেন:
s = s.strip(' \t\n\r')
এই যে কোনো স্থান স্ট্রিপ করবে \t
, \n
অথবা \r
বাম দিকে থেকে অক্ষর, ডান দিকে, বা স্ট্রিং উভয় পক্ষের।
উপরের উদাহরণগুলি কেবল স্ট্রিংয়ের বাম-হাত এবং ডান হাতের স্ট্রিংগুলি সরিয়ে দেয়। আপনি যদি একটি স্ট্রিংয়ের মাঝামাঝি থেকে অক্ষরও সরাতে চান তবে চেষ্টা করুন re.sub
:
import re
print re.sub('[\s+]', '', s)
এটি মুদ্রণ করা উচিত:
astringexample
str.replace(" ","")
। আপনার re
একাধিক জায়গা না থাকলে আপনার ব্যবহারের দরকার নেই, তবে আপনার উদাহরণটি কার্যকর হয় না। []
একক অক্ষর চিহ্নিত করার জন্য ডিজাইন করা হয়েছে, আপনি যদি সঠিক ব্যবহার করেন তবে এটি অপ্রয়োজনীয় \s
। ব্যবহারের পারেন \s+
বা [\s]+
(অপ্রয়োজনীয়) কিন্তু [\s+]
কাজ করে না, বিশেষ করে যদি আপনি বাঁক মত একটি একক এক সঙ্গে একাধিক স্পেস প্রতিস্থাপন করতে চান "this example"
মধ্যে "this example"
।
\s
যখন ট্যাব অন্তর্ভুক্ত করা হবে replace(" ", "")
না।
হোয়াইটস্পেসের শীর্ষস্থানীয় এবং অনুসরণ করার জন্য:
s = ' foo \t '
print s.strip() # prints "foo"
অন্যথায়, একটি নিয়মিত প্রকাশ কাজ করে:
import re
pat = re.compile(r'\s+')
s = ' \t foo \t bar \t '
print pat.sub('', s) # prints "foobar"
pat = re.compile(r'\s+')
sub(" ", s)
না ""
করতে চান এবং আপনি আর .split(" ")
টোকেনাইজ করতে সক্ষম হবেন না ।
print
বিবৃতিগুলির আউটপুটটি দেখে ভাল লাগবে
আপনি খুব সাধারণ এবং মৌলিক ফাংশনটিও ব্যবহার করতে পারেন: স্ট্রাইর রিস্লেস () , হোয়াইট স্পেস এবং ট্যাবগুলির সাথে কাজ করে:
>>> whitespaces = " abcd ef gh ijkl "
>>> tabs = " abcde fgh ijkl"
>>> print whitespaces.replace(" ", "")
abcdefghijkl
>>> print tabs.replace(" ", "")
abcdefghijkl
সহজ এবং সহজ।
#how to trim a multi line string or a file
s=""" line one
\tline two\t
line three """
#line1 starts with a space, #2 starts and ends with a tab, #3 ends with a space.
s1=s.splitlines()
print s1
[' line one', '\tline two\t', 'line three ']
print [i.strip() for i in s1]
['line one', 'line two', 'line three']
#more details:
#we could also have used a forloop from the begining:
for line in s.splitlines():
line=line.strip()
process(line)
#we could also be reading a file line by line.. e.g. my_file=open(filename), or with open(filename) as myfile:
for line in my_file:
line=line.strip()
process(line)
#moot point: note splitlines() removed the newline characters, we can keep them by passing True:
#although split() will then remove them anyway..
s2=s.splitlines(True)
print s2
[' line one\n', '\tline two\t\n', 'line three ']
এখনও কেউ এই রেজেক্স সমাধান পোস্ট করেনি।
মিলছে না:
>>> import re
>>> p=re.compile('\\s*(.*\\S)?\\s*')
>>> m=p.match(' \t blah ')
>>> m.group(1)
'blah'
>>> m=p.match(' \tbl ah \t ')
>>> m.group(1)
'bl ah'
>>> m=p.match(' \t ')
>>> print m.group(1)
None
অনুসন্ধান করা হচ্ছে (আপনাকে "কেবলমাত্র স্পেস" ইনপুট কেসকে আলাদাভাবে পরিচালনা করতে হবে):
>>> p1=re.compile('\\S.*\\S')
>>> m=p1.search(' \tblah \t ')
>>> m.group()
'blah'
>>> m=p1.search(' \tbl ah \t ')
>>> m.group()
'bl ah'
>>> m=p1.search(' \t ')
>>> m.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
আপনি যদি ব্যবহার করেন তবে আপনি re.sub
অভ্যন্তরীণ সাদা স্থান সরিয়ে ফেলতে পারেন , এটি অনাকাঙ্ক্ষিত হতে পারে।
(re.sub ('+', '', (my_str.replace ('\ n', '')))) স্ট্রিপ ()
এটি সমস্ত অবাঞ্ছিত স্থান এবং নিউলাইন অক্ষরগুলি সরিয়ে ফেলবে। এই সাহায্য আশা করি
import re
my_str = ' a b \n c '
formatted_str = (re.sub(' +', ' ',(my_str.replace('\n',' ')))).strip()
এর ফলস্বরূপ:
'a b \ nc' কে 'ab c' এ পরিবর্তন করা হবে
something = "\t please_ \t remove_ all_ \n\n\n\nwhitespaces\n\t "
something = "".join(something.split())
আউটপুট:
please_remove_all_whitespaces
something = "\t please \t remove all extra \n\n\n\nwhitespaces\n\t "
something = " ".join(something.split())
আউটপুট:
দয়া করে সমস্ত অতিরিক্ত সাদা স্থান সরিয়ে দিন
পাইথন 3 ব্যবহার করা হলে: আপনার মুদ্রণ বিবৃতিতে, sep = "" দিয়ে শেষ করুন। এটি সমস্ত স্থানকে আলাদা করবে separate
উদাহরণ:
txt="potatoes"
print("I love ",txt,"",sep="")
এটি মুদ্রণ করবে: আমি আলু পছন্দ করি।
পরিবর্তে: আমি আলু পছন্দ করি।
আপনার ক্ষেত্রে, যেহেতু আপনি of t আরোহণের চেষ্টা করছেন, সেপ = "\ t" করুন
বিভিন্ন ডিগ্রি বোঝার সাথে এখানে বেশ কয়েকটি সমাধান দেখার পরে আমি ভাবলাম যে স্ট্রিংটি কমাটি পৃথক করা থাকলে কী করবো ...
যোগাযোগের তথ্যের একটি সিএসভি প্রক্রিয়া করার চেষ্টা করার সময়, আমার এই সমস্যার সমাধানের দরকার ছিল: এক্সটেনারাস হোয়াইটস্পেস এবং কিছু জাঙ্ক ট্রিম করুন, তবে ট্রেলিং কমা এবং অভ্যন্তরীণ সাদা স্থান সংরক্ষণ করুন। পরিচিতিগুলিতে নোটযুক্ত ক্ষেত্রের সাথে কাজ করা, আমি ভাল জিনিস ফেলে রেখে আবর্জনা সরিয়ে ফেলতে চেয়েছিলাম। সমস্ত বিরামচিহ্ন এবং ছাফ ছাঁটাই, আমি যৌগিক টোকেনগুলির মধ্যে শ্বেত স্থানটি হারাতে চাইনি কারণ আমি পরে পুনর্নির্মাণ করতে চাইনি।
[\s_]+?\W+
প্যাটার্নটি কোনও শ্বেতস্থান চরিত্রের একক উদাহরণ এবং আন্ডারস্কোর ('_') থেকে অলস সীমিতভাবে (যতটা সম্ভব কয়েকটি অক্ষর) [\s_]+?
অবিশ্বাস্য অক্ষর 1 থেকে সীমাহীন পরিমাণে সংঘটিত হওয়ার আগে আসে এর সাথে সময়: \W+
(সমান [^a-zA-Z0-9_]
)। বিশেষত, এটি শ্বেত স্পেসের swaths সন্ধান করে: নাল অক্ষর (\ 0), ট্যাব (\ t), নিউলাইনস (\ n), ফিড-ফরোয়ার্ড (\ f), ক্যারেজ রিটার্ন (\ r)।
আমি এর দ্বিগুণ হিসাবে সুবিধাটি দেখতে পাচ্ছি:
যে এটি সম্পূর্ণ শব্দ / টোকেনগুলির মধ্যে শ্বেতস্পেস সরিয়ে দেয় না যা আপনি একসাথে রাখতে চান;
পাইথনের বিল্ট ইন স্ট্রিং পদ্ধতি স্ট্রিংয়ের মধ্যে strip()
ডিল করে না, কেবল বাম এবং ডান প্রান্তে এবং ডিফল্ট আর্গটি নাল অক্ষর (নীচের উদাহরণ দেখুন: বেশ কয়েকটি নিউলাইনগুলি পাঠ্যে রয়েছে, এবং strip()
সেগুলি সমস্ত অপসারণ করে না যখন রেজেক্স প্যাটার্নটি করে) ।text.strip(' \n\t\r')
এটি ওপিএসের প্রশ্নের বাইরে নয়, তবে আমি মনে করি যে পাঠ্য উপাত্তের মধ্যে আমাদের অনেকগুলি বেদনা, প্যাথলজিকাল দৃষ্টান্ত থাকতে পারে, যেমনটি আমি করেছি (কিছু অংশে কীভাবে পালানোর অক্ষরগুলি শেষ হয়েছিল)। তদুপরি, তালিকার মতো স্ট্রিংগুলিতে, আমরা '-,' বা '-', ', যেমন দুটি সাদা অংশের অক্ষর বা কিছু শব্দবিহীন অক্ষর পৃথক না করে আমরা সীমানারটি অপসারণ করতে চাই না।
এনবি: নিজেই সিএসভি-র সীমানার কথা বলছে না। কেবলমাত্র CSV এর মধ্যে এমন উদাহরণ যেখানে ডেটা তালিকার মতো, অর্থাৎ সাবস্ট্রিংয়ের একটি সিএস স্ট্রিং।
সম্পূর্ণ প্রকাশ: আমি কেবল প্রায় একমাস ধরে পাঠ্যকে হেরফের করছি এবং কেবল গত দুই সপ্তাহ ধরে রেজিেক্স করেছি, তাই আমি নিশ্চিত যে আমি কিছু অনুপস্থিত রয়েছি তা নিশ্চিত। এতে বলা হয়েছে, স্ট্রিংয়ের ছোট সংগ্রহের জন্য (আমার 12,000 সারি এবং 40 টি বিজোড় কলামের ডেটাফ্রেমে রয়েছে), বহিরাগত চরিত্রগুলি অপসারণের জন্য একটি চূড়ান্ত পদক্ষেপ হিসাবে, এটি ব্যতিক্রমীভাবে কার্যকরভাবে কাজ করে, বিশেষত যদি আপনি কিছু অতিরিক্ত শ্বেত স্পেস চালু করেন যেখানে আপনি একটি শব্দহীন চরিত্রের সাথে যোগ হওয়া পাঠ্যকে আলাদা করতে চাই, তবে শ্বেত স্পেস যোগ করতে চাই না যেখানে আগে কখনও ছিল না।
একটি উদাহরণ:
import re
text = "\"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , , dd invites,subscribed, , , , \r, , \0, ff dd \n invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s, \n i69rpofhfsp9t7c practice 20ignition - 20june \t\n .2134.pdf 2109 \n\n\n\nklkjsdf\""
print(f"Here is the text as formatted:\n{text}\n")
print()
print("Trimming both the whitespaces and the non-word characters that follow them.")
print()
trim_ws_punctn = re.compile(r'[\s_]+?\W+')
clean_text = trim_ws_punctn.sub(' ', text)
print(clean_text)
print()
print("what about 'strip()'?")
print(f"Here is the text, formatted as is:\n{text}\n")
clean_text = text.strip(' \n\t\r') # strip out whitespace?
print()
print(f"Here is the text, formatted as is:\n{clean_text}\n")
print()
print("Are 'text' and 'clean_text' unchanged?")
print(clean_text == text)
এই ফলাফলগুলি:
Here is the text as formatted:
"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"
using regex to trim both the whitespaces and the non-word characters that follow them.
"portfolio, derp, hello-world, hello-, world, founders, mentors, ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, ff, series a, exit, general mailing, fr, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, jim.somedude@blahblah.com, dd invites,subscribed,, master, dd invites,subscribed, ff dd invites, subscribed, alumni spring 2012 deck: https: www.dropbox.com s, i69rpofhfsp9t7c practice 20ignition 20june 2134.pdf 2109 klkjsdf"
Very nice.
What about 'strip()'?
Here is the text, formatted as is:
"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"
Here is the text, after stipping with 'strip':
"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"
Are 'text' and 'clean_text' unchanged? 'True'
সুতরাং স্ট্রিপ একবারে একটি সাদা স্থান সরিয়ে দেয়। ওপিএস ক্ষেত্রে strip()
তাই ঠিক আছে। তবে যদি জিনিসগুলি আরও জটিল হয়, রেজেক্স এবং অনুরূপ প্যাটার্ন আরও সাধারণ সেটিংসের জন্য কিছুটা মূল্যবান হতে পারে।
অনুবাদ চেষ্টা করুন
>>> import string
>>> print '\t\r\n hello \r\n world \t\r\n'
hello
world
>>> tr = string.maketrans(string.whitespace, ' '*len(string.whitespace))
>>> '\t\r\n hello \r\n world \t\r\n'.translate(tr)
' hello world '
>>> '\t\r\n hello \r\n world \t\r\n'.translate(tr).replace(' ', '')
'helloworld'
আপনি যদি স্ট্রিংয়ের শুরু এবং শেষের অংশে সাদা স্থানটি ছাঁটাই করতে চান তবে আপনি এই জাতীয় কিছু করতে পারেন:
some_string = " Hello, world!\n "
new_string = some_string.strip()
# new_string is now "Hello, world!"
এটি Qt এর QString :: trimmed () পদ্ধতির মতো অনেকটা কাজ করে, যাতে এটি অভ্যন্তরীণ শ্বেতস্থানকে একা রেখে, অগ্রণী এবং পেছনের শ্বেত স্থানটি সরিয়ে দেয়।
তবে আপনি যদি Qt এর QString :: সরলীকৃত () পদ্ধতির মতো কিছু চান যা কেবল শীর্ষস্থানীয় এবং চলমান শ্বেতস্পেসকেই সরিয়ে দেয় না, পাশাপাশি সমস্ত স্থানের অভ্যন্তরীণ সাদা স্থানকে একটি স্পেস ক্যারেক্টারে "স্কুইশ" করে, আপনি এর সংমিশ্রণটি .split()
এবং ব্যবহার করতে পারেন " ".join
:
some_string = "\t Hello, \n\t world!\n "
new_string = " ".join(some_string.split())
# new_string is now "Hello, world!"
এই শেষ উদাহরণে, অভ্যন্তরীণ শ্বেত স্পেসের প্রতিটি ক্রমটি একটি একক স্থানের সাথে প্রতিস্থাপিত হয়েছিল, যখন স্ট্রিংয়ের শুরু এবং শেষের পরেও সাদা স্থানটিকে ছাঁটাই করা হচ্ছে।
সাধারণত, আমি নিম্নলিখিত পদ্ধতিটি ব্যবহার করছি:
>>> myStr = "Hi\n Stack Over \r flow!"
>>> charList = [u"\u005Cn",u"\u005Cr",u"\u005Ct"]
>>> import re
>>> for i in charList:
myStr = re.sub(i, r"", myStr)
>>> myStr
'Hi Stack Over flow'
দ্রষ্টব্য: এটি কেবল "\ n", "\ r" এবং "\ t" অপসারণের জন্য। এটি অতিরিক্ত স্থান সরিয়ে দেয় না।
স্ট্রিংয়ের মাঝখানে থেকে সাদা স্থানগুলি সরিয়ে ফেলার জন্য
$p = "ATGCGAC ACGATCGACC";
$p =~ s/\s//g;
print $p;
আউটপুট:
ATGCGACACGATCGACC
এটি স্ট্রিংয়ের শুরু এবং শেষ উভয় দিক থেকে সমস্ত সাদা স্থান এবং নিউলাইনগুলি সরিয়ে ফেলবে:
>>> s = " \n\t \n some \n text \n "
>>> re.sub("^\s+|\s+$", "", s)
>>> "some \n text"
s.strip()
ঠিক যখন এটি করা হয় তখন কেন একটি রেজেক্স ব্যবহার করবেন ?
s.strip()
কেবলমাত্র প্রাথমিক সাদা স্থান পরিচালনা করে , তবে অন্যান্য অযাচিত অক্ষর মুছে ফেলার পরে হোয়াইটস্পেস "আবিষ্কার করা" নয়। নোট করুন যে এটি চূড়ান্ত অগ্রণী হওয়ার পরেও শ্বেত স্থানটি সরিয়ে ফেলবে\n
s.strip()
ঠিক আপনার রেজেক্সের মতো একই ফলাফল তৈরি করে।