পাইথন স্ট্রিংয়ে 3 টি ব্যাকস্ল্যাশস কেন সমান 4 হয়?


90

আপনি আমাকে বলতে পারেন কেন '?\\\?'=='?\\\\?'দেয় True? এটি আমাকে পাগল করে তোলে এবং আমি যুক্তিসঙ্গত উত্তর খুঁজে পাই না ...

>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']

8
পরেরটি কোনও কিছুই এড়ায় না তাই এটি নিজেই পালিয়ে যায়
প্যাডেরিক কানিংহাম

4
list()এমনকি অন্তর্ভুক্ত করার দরকার নেই :>>> '?\\\?' '?\\\\?'
ডাবরোস

@ পেড্রেইক কানিংহাম এটি "নিজেই পালিয়ে যাওয়া" শেষ করে না। এমনকি এর অর্থ কি?
ব্যবহারকারী 253751

মজাদারভাবে, কারণটি হ'ল তারা উভয়ই দুটি ব্যাকস্ল্যাশ সমান :-)
রিমকো গ্রিলিচ

@ মিম্বিস, ঠিক এটিই ঘটছে। আপনি repr এবং str এর মধ্যে পার্থক্য জানেন? স্ট্রিংয়ে একটি ব্যাকস্ল্যাশ দিয়ে উভয়কেই মুদ্রণের চেষ্টা করুন এবং এটি স্পষ্ট হয়ে উঠতে পারে
প্যাডেরিক কানিংহাম

উত্তর:


84

মূলত, কারণ পাইথন ব্যাকস্ল্যাশ প্রসেসিংয়ে সামান্য লেন্সিয়েন্ট। Https://docs.python.org/2.0/ref/strings.html থেকে উদ্ধৃতি :

স্ট্যান্ডার্ড সি থেকে পৃথক, সমস্ত অবিশ্রুত এস্কেপ সিকোয়েন্সগুলি স্ট্রিংটিতে অপরিবর্তিত রয়েছে, অর্থাৎ ব্যাকস্ল্যাশটি স্ট্রিংয়ে রেখে গেছে

(মূল জোর দেওয়া)

অতএব, অজগর ক্ষেত্রে, এটি তিনটি ব্যাকস্ল্যাশ চারটির সমান নয়, আপনি যখন একটি চরিত্রের সাথে ব্যাকস্ল্যাশ অনুসরণ করেন তখন ?দু'জনে দুটি চরিত্র হিসাবে উপস্থিত হয়, কারণ \?এটি একটি স্বীকৃত পালানোর ক্রম নয়।


6
এটা লেন্সিয়েন্টের বিপরীত। লেনিয়েন্ট হ'ল অন্য সকলের আচরণ "যদি আপনি এমন কোনও চরিত্রের ব্যাকস্ল্যাশ করেন যা যার প্রয়োজন হয় না, ব্যাকস্ল্যাশ কিছুই করে না"। একসাথে অন্য কনভেনশনের সাথে (যে ব্যাকস্ল্যাশিং অক্ষরগুলি তাদের বিশেষ করে তুলতে পারে, তবে ব্যাকস্ল্যাশিং বিরামচিহ্নগুলি সর্বদা এটি অ-বিশেষ করে তোলে), আপনি খুব সুন্দর সম্পত্তি পেয়ে যাচ্ছেন যে কোনও অক্ষর বিশেষভাবে রয়েছে তা না জেনে আপনি সমস্ত বিরামচিহ্নকে ব্যাকস্ল্যাশিং করে একটি স্ট্রিংকে নিরাপদে অপসারণ করতে পারেন you ইন্টারপেটেড - এমন একটি সম্পত্তি যা পাইথনের অভাব রয়েছে।
hobbs

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

@ ড্যানিয়েলমার্টিনে এমন কিছু ভাষা রয়েছে যেখানে ডিলিমিটার তার নিজস্ব পালানোর চরিত্র হিসাবে কাজ করে (উদাঃ 'escape''d')। আপনাকে সেখানে অন্য চরিত্রগুলি মনে রাখতে হবে না!
SztupY

4
ওহ অপেক্ষা করুন, আমি অনুমান করি যে স্ট্যান্ডার্ড পাস্কেলটিও
ড্যানিয়েল মার্টিন

4
@ ড্যানিয়েলমার্টিন এসকিউএল।
র্যান্ডম 832

30

এর কারণ কারণ ব্যাকস্ল্যাশ অক্ষরগুলি অনুসরণ করে অবিলম্বে অক্ষরগুলির জন্য একটি পালানোর চরিত্র হিসাবে কাজ করে, যদি সংমিশ্রণটি কোনও বৈধ অব্যাহতি ক্রমের প্রতিনিধিত্ব করে। ডজন বা তার বেশি পালানোর সিকোয়েন্সগুলি এখানে তালিকাভুক্ত করা হয়েছে । এগুলিতে নিউলাইন \n, অনুভূমিক ট্যাব \t, ক্যারেজ রিটার্ন \rএবং আরও কিছু অস্পষ্ট যেমন নামক ইউনিকোড অক্ষর ব্যবহার করে \N{...}যেমন, যেমন \N{WAVY DASH}ইউনিকোড চরিত্রকে উপস্থাপন করে , এর মতো স্পষ্টতাকে অন্তর্ভুক্ত করে \u3030। যদিও মূল বিষয়টি হ'ল পালাবার ক্রমটি যদি না জানা থাকে তবে অক্ষরের অনুক্রমটি স্ট্রিংয়ের মতোই থাকে।

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

>>> '?\\\?'
'?\\\\?'
>>> print('?\\\?')
?\\?
>>> '?\\\?' == '?\\?'    # I don't know why you think this is True???
False
>>> '?\\\?' == r'?\\?'   # but if you use a raw string for '?\\?'
True
>>> '?\\\\?' == '?\\\?'  # this is the same string... see below
True

আপনার নির্দিষ্ট উদাহরণগুলির জন্য, প্রথম ক্ষেত্রে '?\\\?', প্রথমটি \একটি ব্যাকস্ল্যাশ রেখে দ্বিতীয় ব্যাকস্ল্যাশ থেকে বেরিয়ে যায়, তবে তৃতীয় ব্যাকস্ল্যাশ ব্যাকস্ল্যাশ হিসাবে রয়ে গেছে কারণ \?এটি বৈধ পালানোর ক্রম নয়। ফলস্বরূপ স্ট্রিং হয় ?\\?

দ্বিতীয় কেসের জন্য '?\\\\?', প্রথম ব্যাকস্ল্যাশ দ্বিতীয়টি পলায়ন করে এবং তৃতীয় ব্যাকস্ল্যাশ চতুর্থ থেকে পলায়ন করে যার ফলস্বরূপ স্ট্রিং হয় ?\\?

সুতরাং তিনটি ব্যাকস্ল্যাশ চারটি একই:

>>> '?\\\?' == '?\\\\?'
True

আপনি যদি 3 টি ব্যাকস্ল্যাশ দিয়ে একটি স্ট্রিং তৈরি করতে চান তবে আপনি প্রতিটি ব্যাকস্ল্যাশ থেকে রক্ষা পেতে পারেন:

>>> '?\\\\\\?'
'?\\\\\\?'
>>> print('?\\\\\\?')
?\\\?

অথবা আপনি "কাঁচা" স্ট্রিংগুলি আরও বোধগম্য হতে পারেন:

>>> r'?\\\?'
'?\\\\\\?'
>>> print(r'?\\\?')
?\\\?

আক্ষরিক স্ট্রিংয়ের জন্য এই পালানোর ক্রম প্রক্রিয়াকরণে পরিণত হয়। আরও তথ্যের জন্য স্ট্রিং লিটারালগুলি দেখুন ।


আপনি ঠিক '?\\\?'=='?\\?'দেয় False, আমি এটা ভুল টাইপ। '?\\\?'=='?\\\\?'প্রশ্নটি ইঙ্গিত হিসাবে এটি হওয়া উচিত , আমি এটি সংশোধন করেছি।
kozooh

13

কারণ \xএকটি অক্ষর স্ট্রিং, যখন xমত বিশেষ backslashable অক্ষরের এক নয় n, r, t, 0, ইত্যাদি, একটি ব্যাকস্ল্যাশ এবং তারপর সঙ্গে একটি স্ট্রিং মূল্যায়ণ x

>>> '\?'
'\\?'

7

স্ট্রিং লিটারালগুলিতে পাইথন লেজিকাল বিশ্লেষণ পৃষ্ঠাটি থেকে: https://docs.python.org/2/references/lexical_analysis.html

একটি টেবিল রয়েছে যা সমস্ত স্বীকৃত পালানোর ক্রমগুলি তালিকাবদ্ধ করে।

হল একটি পালানোর ক্রম যা === \

? একটি পালানোর ক্রম নয় এবং এটি === \?

সুতরাং '\\\\' '\\' এর পরে '\\' যা '\\' (দু'জন পালিয়ে গেছে \)

এবং '\\\' '\\' এর পরে '\' হয় যা '\\' (একজন পালিয়ে যায় \ এবং একটি কাঁচা \)

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

সুতরাং 'স্ট্রিং' এবং "স্ট্রিং" অজগরটিতে হুবহু একই জিনিস, তারা পালানোর ক্রমের ব্যাখ্যাগুলিকে প্রভাবিত করে না।


1

মাওহকের উত্তরটি একে একে অনেকটা কভার করে, আমি কেবল এটি আরও সংক্ষিপ্ত আকারে এবং এই আচরণের চিত্রিত করে এমন ন্যূনতম উদাহরণ সহ পুনরায় পুনঃস্থাপন করতে চাই।

আমার অনুমান করার মতো একটি বিষয় হ'ল এস্কেপ প্রসেসিংটি বাম থেকে ডানে চলে আসে, যাতে \nপ্রথমে ব্যাকস্ল্যাশটি খুঁজে পাওয়া যায় এবং তারপরে পালানোর জন্য একটি চরিত্রের সন্ধান করা হয়, তারপরে এটি খুঁজে বের হয় nএবং পালিয়ে যায়; \\nপ্রথমে ব্যাকস্ল্যাশ সন্ধান করে, দ্বিতীয়টি খুঁজে বের করে এবং তার থেকে পালিয়ে যায়, তারপরে nএটি আক্ষরিক এন হিসাবে খুঁজে পায় এবং দেখে; \?ব্যাকস্ল্যাশ সন্ধান করে এবং পালানোর জন্য চরের সন্ধান করে, ?যা এড়ানো যায় না এবং এটি \আক্ষরিক ব্যাকস্ল্যাশ হিসাবে বিবেচনা করে ।

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

>>> print('\?') # \? is not a valid escape code so backslash is left as-is
\?
>>> print('\\?') # \\ is a valid escape code, resulting in a single backslash
'\?'

>>> '\?' # same as first example except that interactive interpreter escapes the backslash
\\?
>>> '\\?' # same as second example, backslash is again escaped
\\?
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.