"ইউ" এবং "আর" স্ট্রিং ফ্ল্যাগগুলি ঠিক কী করে এবং কাঁচা স্ট্রিং লিটারেলগুলি কী?


652

এই প্রশ্নটি জিজ্ঞাসা করার সময় , আমি বুঝতে পেরেছি কাঁচা স্ট্রিং সম্পর্কে আমি বেশি কিছু জানি না। জ্যাঙ্গো প্রশিক্ষক হিসাবে দাবি করার জন্য কারও কাছে এটি সফল হয়।

আমি জানি যে একটি এনকোডিং কী, এবং আমি জানি যে u''একা কী করে যেহেতু আমি ইউনিকোড যা পেয়েছি।

  • তবে r''ঠিক কী করে ? এর ফলে কোন ধরণের স্ট্রিং হয়?

  • এবং সর্বোপরি, হেক ur''কি করে?

  • অবশেষে, কোনও ইউনিকোড স্ট্রিং থেকে সাধারণ কাঁচা স্ট্রিংয়ে ফিরে যাওয়ার কোনও নির্ভরযোগ্য উপায় নেই?

  • আহা, এবং যাইহোক, যদি আপনার সিস্টেম এবং আপনার পাঠ্য সম্পাদকের চরসেটটি ইউটিএফ -8 তে সেট করা থাকে তবে u''আসলে কিছু করা যায়?

উত্তর:


683

আসলে কোনও "কাঁচা স্ট্রিং " নেই; কাঁচা স্ট্রিং লিটারাল রয়েছে , যা হ'ল স্ট্রিং ল্যাটারালগুলি 'r'খোলার উদ্ধৃতির আগে একটি দ্বারা চিহ্নিত করা হয়েছিল ।

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

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

r'...'একটি বাইট স্ট্রিং (ইন পাইথন 2. *) হল ur'...'একটি ইউনিকোড স্ট্রিং (আবার, পাইথন 2. *), এবং মূল্য উদ্ধৃতি অন্যান্য তিন প্রকারঃ কোন এছাড়াও ঠিক স্ট্রিং একই ধরনের উত্পাদন করে (তাই উদাহরণস্বরূপ r'...', r'''...''', r"...", r"""..."""সমস্ত বাইট স্ট্রিং, এবং অন্যান্য)।

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

এবং হ্যাঁ, এ পাইথন 2. *, u'...' হয় অবশ্যই সবসময় শুধু থেকে স্বতন্ত্র '...', পরেরটির একটি বাইট স্ট্রিং সাবেক একটি ইউনিকোড স্ট্রিং -। আক্ষরিক কী এনকোডিং হতে পারে তা সম্পূর্ণরূপে অर्थোগোনাল ইস্যু।

উদাহরণস্বরূপ, বিবেচনা করুন (পাইথন ২.6):

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

অবশ্যই ইউনিকোড অবজেক্টে আরও মেমরি স্পেস লাগে (খুব স্বল্প স্ট্রিংয়ের জন্য খুব ছোট পার্থক্য, স্পষ্টত ;-)।


6
"আর" বোঝা কোনও প্রকারের বা এনকোডিংয়ের বিষয় বোঝায় না, এটি অনেক সহজ।
ই-সন্তুষ্ট

23
নোট করুন যে রু "সি: \ ফু \ অস্থির" ব্যর্থ হবে কারণ ru ইউ রু মোডে একটি ইউনিকোড পালানোর ক্রম। r মোডে \ u নেই।
কার্টিস ইয়ালাপ

26
নোট করুন uএবং rপরিবর্তনমূলক নয়: ur'str'কাজ করে না ru'str'। (উইন 7-এ কমপক্ষে আইপথন ২.7.২ এ)
রফিক

7
কেবল rস্ট্রিং পরীক্ষা করে লক্ষ্য করেছেন যে \ শেষ চরিত্রটি হলে এটি আক্ষরিক হিসাবে নেওয়া হবে না বরং এর পরিবর্তে সমাপ্তি উদ্ধৃতিটি থেকে পালিয়ে যায় SyntaxError: EOL while scanning string literal। সুতরাং \\ এখনও \ কোনও ব্যাকস্ল্যাশ দিয়ে শেষ হওয়া কোনও স্ট্রিংয়ের চূড়ান্ত উদাহরণের জন্য অবশ্যই ব্যবহার করা উচিত ।
এনটেলফর্ম

1
পাইথন 3.x - sys.getsizeof('cioa') == sys.getsizeof(r'cioa') == sys.getsizeof(u'cioa')(ইউটিএফ 8 ল্যাং সহ উবুন্টু 16.04)। একইভাবে type('cioa') == type(r'cioa') == type(u'cioa'),। কিন্তু, কাঁচা স্ট্রিং অন্তরঙ্গকরণ একটি পার্থক্য তোলে, তাইsys.getsizeof('\ncioa') == sys.getsizeof(u'\ncioa') != sys.getsizeof(r'\ncioa')
ড্যারেন ওয়েবার

177

পাইথনে দুটি ধরণের স্ট্রিং রয়েছে: প্রচলিত strধরণ এবং নতুন unicodeধরণের। আপনি যদি uসামনে স্ট্রিং ছাড়া স্ট্রিং আক্ষরিক টাইপ করেন তবে আপনি পুরানো strটাইপটি পাবেন যা 8-বিট অক্ষর সংরক্ষণ করে uএবং সামনে দিয়ে আপনি একটি নতুন unicodeপ্রকার পাবেন যা কোনও ইউনিকোড অক্ষর সংরক্ষণ করতে পারে।

rএ সব ধরনের পরিবর্তন না, এটা ঠিক পরিবর্তন কিভাবে স্ট্রিং আক্ষরিক ব্যাখ্যা করা হয়। ছাড়া r, ব্যাকস্ল্যাশগুলি পালানোর চরিত্র হিসাবে বিবেচিত হয়। এর সাথে r, ব্যাকস্ল্যাশগুলি আক্ষরিক হিসাবে বিবেচিত হয়। যেভাবেই হোক, টাইপটি একই রকম।

ur অবশ্যই একটি ইউনিকোড স্ট্রিং যেখানে ব্যাকস্ল্যাশগুলি আক্ষরিক ব্যাকস্ল্যাশ হয়, এস্কেপ কোডগুলির অংশ নয়।

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


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

6
ব্যাকস্ল্যাশগুলিকে কাঁচা স্ট্রিং লিটারালগুলিতে আক্ষরিক হিসাবে বিবেচনা করা হয় না, এ কারণেই r"\"একটি সিনট্যাক্স ত্রুটি।

4
কেবল পাইথন 2 এ প্রয়োগ হয়
পলমিসজি

60

'কাঁচা স্ট্রিং' এর অর্থ এটি প্রদর্শিত হিসাবে এটি সংরক্ষণ করা হয়। উদাহরণস্বরূপ, পালানোর পরিবর্তে '\'কেবল ব্যাকস্ল্যাশ


3
... যদি না এটি স্ট্রিংয়ের শেষ চরিত্র, তবে এই ক্ষেত্রে এটি সমাপনী উদ্ধৃতিটি এড়ায় না।
জেজ

36

একটি "u" উপসর্গের unicodeচেয়ে মানটি প্রকারের চেয়ে বেশি প্রকার হয় str

কাঁচা স্ট্রিং লিটারেল, একটি "r" বা প্রেফিক্স সহ তাদের মধ্যে যে কোনো পালাবার ক্রম অব্যাহতি, তাই len(r"\n")এটি কোন বৈধ পালাবার ক্রম (যেমন নয়: 2. করা হয়েছে কারণ তিনি পালাবার ক্রম অব্যাহতি, আপনি একটি একক ব্যাকস্ল্যাশ সঙ্গে একটি স্ট্রিং আক্ষরিক শেষ হতে পারে না r"\")।

"কাঁচা" ধরণের অংশ নয়, এটি মান উপস্থাপনের একমাত্র উপায়। উদাহরণস্বরূপ, "\\n"এবং r"\n"ঠিক অভিন্ন মান, 32, 0x20, এবং 0b100000অভিন্ন।

আপনি ইউনিকোড কাঁচা স্ট্রিং আক্ষরিক থাকতে পারে:

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

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

ASCII (বা ইউটিএফ -8, পাইথন 3.0 এর জন্য) ব্যবহার করা ফাইলগুলির কোডিং কুকি থাকা উচিত নয়। ল্যাটিন -1 (বা ইউটিএফ -8) কেবল তখনই ব্যবহার করা উচিত যখন কোনও মন্তব্য বা ডক্ট্রাস্টিংয়ের কোনও লেখকের নাম উল্লেখ করা দরকার যা ল্যাটিন -1 প্রয়োজন; অন্যথায়, \ x, or u বা escap U পলায়ন ব্যবহার করা স্ট্রিং লিটারালগুলিতে অ-এএসসিআইআই ডেটা অন্তর্ভুক্ত করার পছন্দসই উপায়।


30

আমাকে এটি সহজভাবে ব্যাখ্যা করতে দাও: পাইথন 2 এ, আপনি 2 টি বিভিন্ন ধরণের স্ট্রিং সংরক্ষণ করতে পারেন।

প্রথম এক হওয়া ASCII যা Str পাইথন টাইপ, এটা মেমরি 1 বাইট ব্যবহার করে। (256 টি অক্ষর, বেশিরভাগ ইংরেজি বর্ণমালা এবং সাধারণ প্রতীক সংরক্ষণ করবে)

2nd ধরনের ইউনিকোড যা ইউনিকোড পাইথন টাইপ করুন। ইউনিকোড সব ধরণের ভাষা সঞ্চয় করে।

ডিফল্টরূপে, পাইথন গ্রহন করেবেন Str টাইপ কিন্তু যদি আপনি সঞ্চয় স্ট্রিং করতে চান ইউনিকোড ধরনের লাগাতে পারেন U মত টেক্সট সামনে u'text ' অথবা আপনি কল করে এই কাজ করতে পারেন ইউনিকোড (' টেক্সট ')

সুতরাং তোমার দর্শন লগ করা অল্প পথ ঢালাই করার জন্য একটি ফাংশন কল করা হয় Str করার ইউনিকোড । এটাই!

এখন আর অংশটি, আপনি এটি লেখার সামনে রেখে কম্পিউটারকে জানান যে পাঠ্যটি কাঁচা পাঠ্য, ব্যাকস্ল্যাশ একটি পালানোর অক্ষর হওয়া উচিত নয়। r '। n' একটি নতুন লাইন চরিত্র তৈরি করবে না। এটি কেবল 2 টি অক্ষর সমেত সরল পাঠ্য।

আপনি রূপান্তর করতে চান Str করার ইউনিকোড এবং সেখানে কাঁচা টেক্সট করা, ব্যবহার উর কারণ রুশ ভাষায় একটি ত্রুটি তুলব।

এখন, গুরুত্বপূর্ণ অংশ:

আপনি r ব্যবহার করে একটি ব্যাকস্ল্যাশ সংরক্ষণ করতে পারবেন না , এটি একমাত্র ব্যতিক্রম। সুতরাং এই কোডটি ত্রুটি তৈরি করবে: r '\'

একটি ব্যাকস্ল্যাশ সংরক্ষণ করতে (শুধুমাত্র একটি) আপনার '\\' ব্যবহার করতে হবে

আপনি যদি 1 টির বেশি অক্ষর সঞ্চয় করতে চান তবে আপনি r এর মতো r ব্যবহার করতে পারেন use আপনার প্রত্যাশা অনুযায়ী 2 টি ব্যাকস্প্ল্যাশ তৈরি করবে।

কেন একটি ব্যাকস্ল্যাশ স্টোরেজ দিয়ে r কাজ করে না তা আমি জানি না তবে কারণটি এখনও কারও দ্বারা বর্ণিত হয়নি। আমি আশা করি এটি একটি বাগ।


9
আপনি খেয়াল করবেন যে কেবল অবৈধই নয় r'\', আপনি '\'কোনও স্ট্রিংয়ের লেজে কোনও একটিও রাখতে পারবেন না । ঠিক r'xxxxxx\'যেমন একটি অবৈধ স্ট্রিং।
ডাইভারগার

অজগর 3 কি?
ক্রিশ

1
@ ক্রিশ সমস্ত অজগর 3 স্ট্রিং ইউনিকোড সমর্থিত। এর ধরণ হবে str। : ভাল এখানে বোঝার জন্য আরও পড়ুন medium.com/better-programming/...
off99555

4

সম্ভবত এটি সুস্পষ্ট, সম্ভবত নাও হতে পারে, তবে আপনি x = chr (92) কল করে স্ট্রিংটি '\' তৈরি করতে পারেন

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False

4
x is yপাইথন 3 এ ট্রুতে মূল্যায়ন করে?
হবিব পারওয়াদ

5
@ হবিব পেরওয়াদ, এটি স্ট্রিং ইন্টার্নিংয়ের কারণে । ইন্টার্নিংয়ের কারণে যা x is yমূল্যায়ন হয় তার উপর আপনার কখনই নির্ভর করা উচিত নয় True। পরিবর্তে ব্যবহার করুন x == y(যদি আপনার x এবং y একক মেমরি অবস্থানে একই জিনিস সংরক্ষণ করা হয় তা পরীক্ষা না করে)।
লুকুবরেটর

4

ইউনিকোড স্ট্রিং আক্ষরিক

ইউনিকোড স্ট্রিং ল্যাটারালগুলি (স্ট্রিং ল্যাটারালগুলি পূর্বনির্ধারিত u) আর পাইথন ৩ এ ব্যবহার করা হয় না They এগুলি এখনও বৈধ তবে কেবল পাইথন ২ এর সাথে সামঞ্জস্যের উদ্দেশ্যে

কাঁচা স্ট্রিং আক্ষরিক

তুমি কি ইংরেজি বর্ণ বা সংখ্যা মত শুধুমাত্র সহজে typable অক্ষর নিয়ে গঠিত আক্ষরিক একটি স্ট্রিং তৈরি করতে চান, তাহলে আপনি কেবল তাদের টাইপ করতে পারেন: 'hello world'। তবে আপনি যদি আরও কিছু বিদেশী চরিত্রও অন্তর্ভুক্ত করতে চান তবে আপনাকে কিছুটা বৈকল্পিক ব্যবহার করতে হবে। কাজের ক্ষেত্রগুলির মধ্যে একটি হ'ল এস্কেপ সিকোয়েন্স । এইভাবে আপনি উদাহরণস্বরূপ আপনার স্ট্রিং আক্ষরিকে দুটি সহজেই টাইপযোগ্য অক্ষর যুক্ত করে আপনার স্ট্রিংয়ে একটি নতুন লাইন উপস্থাপন করতে পারেন \n। সুতরাং আপনি যখন 'hello\nworld'স্ট্রিংটি মুদ্রণ করবেন তখন শব্দগুলি পৃথক লাইনে মুদ্রিত হবে। এটা খুব সহজ!

অন্যদিকে, এমন কিছু পরিস্থিতি রয়েছে যখন আপনি একটি স্ট্রিং আক্ষরিক তৈরি করতে চান যেখানে পালানোর ক্রম থাকে তবে আপনি চান না যে সেগুলি পাইথন দ্বারা ব্যাখ্যা করা হোক। আপনি তাদের কাঁচা হতে চান । এই উদাহরণগুলি দেখুন:

'New updates are ready in c:\windows\updates\new'
'In this lesson we will learn what the \n escape sequence does.'

এ জাতীয় পরিস্থিতিতে আপনি কেবল rঅক্ষরের সাথে স্ট্রিং আক্ষরিক উপসর্গ করতে পারেন : r'hello\nworld'এবং কোনও পালানোর অনুক্রম পাইথন দ্বারা ব্যাখ্যা করা হবে না। স্ট্রিংটি আপনি যেমন তৈরি করেছেন ঠিক তেমন মুদ্রণ করা হবে।

কাঁচা স্ট্রিং আক্ষরিক সম্পূর্ণ "কাঁচা" হয় না?

অনেক লোক কাঁচা স্ট্রিংয়ের অক্ষরগুলি এমন অর্থে কাঁচা হওয়ার প্রত্যাশা করে যে "উদ্ধৃতিগুলির মধ্যে যে কোনও কিছুই পাইথন দ্বারা উপেক্ষা করা হবে" । ওটা সত্যি না. পাইথন এখনও সমস্ত পালানোর ক্রমগুলি সনাক্ত করে, এটি কেবল তাদের ব্যাখ্যা করে না - এটি তাদের পরিবর্তে অপরিবর্তিত রাখে। এর অর্থ কাঁচা স্ট্রিং লিটারেলগুলি এখনও বৈধ স্ট্রিং লিটারাল থাকতে হবে

আক্ষরিক স্ট্রিংয়ের সংক্ষিপ্ত সংজ্ঞা থেকে :

string     ::=  "'" stringitem* "'"
stringitem ::=  stringchar | escapeseq
stringchar ::=  <any source character except "\" or newline or the quote>
escapeseq  ::=  "\" <any source character>

এটি স্পষ্ট যে স্ট্রিং লিটারেলগুলি (কাঁচা বা না) একটি খালি উদ্ধৃতি অক্ষর রয়েছে: 'hello'world'বা ব্যাকস্ল্যাশ দিয়ে শেষ: 'hello world\'বৈধ নয়।

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