পাইথনের কাঁচা স্ট্রিং লিটারেলগুলি একক ব্যাকস্ল্যাশ দিয়ে শেষ হতে পারে না কেন?


179

প্রযুক্তিগতভাবে, ডকুমেন্টেশনে বর্ণিত ব্যাকস্ল্যাশগুলির কোনও বিজোড় সংখ্যা ।

>>> r'\'
  File "<stdin>", line 1
    r'\'
       ^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
  File "<stdin>", line 1
    r'\\\'
         ^
SyntaxError: EOL while scanning string literal

দেখে মনে হচ্ছে পার্সার কেবল কাঁচা স্ট্রিংগুলিতে ব্যাকস্ল্যাশগুলিকে নিয়মিত চরিত্র হিসাবে বিবেচনা করতে পারে (কাঁচা স্ট্রিংগুলি কী তা নয়?) তবে আমি সম্ভবত স্পষ্ট কিছু মিস করছি।


8
দেখে মনে হচ্ছে এটি এখন প্রায়শই জিজ্ঞাসিত । আপনি প্রশ্ন জিজ্ঞাসা যখন না হতে পারে। আমি জানি আপনি যে দস্তাবেজগুলি উদ্ধৃত করেছেন তা একই কথা বলে, তবে আমি কেবল ভেবেছিলাম যে আমি নথির অন্য উত্স যুক্ত করব।
oob

উত্তর:


124

কারণটি সেই বিভাগের অংশে ব্যাখ্যা করা হয়েছে যা আমি সাহসীভাবে হাইলাইট করেছি:

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

কাঁচা স্ট্রিংগুলি 100% কাঁচা নয়, এখনও কিছু প্রাথমিক ব্যাকস্ল্যাশ-প্রক্রিয়াজাতকরণ রয়েছে।


21
ওহ বাহ ... অদ্ভুত। সুন্দর ক্যাচ. বোঝায় যে r '\' '== "" \\ "" তবে এটি এখনও অবাক করা যে অব্যাহতি চরিত্রটি অদৃশ্য না হয়ে তার প্রভাব ফেলে।
সিডলারি

2
@ হাইটওয়ার এটি ফাইল সিস্টেমের পাথের জন্য কাজ করতে পারে তবে ব্যাকস্ল্যাশ এর অন্যান্য ব্যবহার রয়েছে। এবং ফাইল সিস্টেমের পাথগুলির জন্য, পৃথককারীটিকে হার্ডকোড করবেন না। 'Os.path.sep' ব্যবহার করুন বা 'os.path' এর উচ্চতর স্তরের বৈশিষ্ট্যগুলি ব্যবহার করুন। (বা 'প্যাথলিব' যখন উপলভ্য থাকে)

5
দ্রষ্টব্য: ওয়ার্কআরাউন্ডটি সংলগ্ন আক্ষরিক উপসংহার ব্যবহার করা। r"foo\bar\baz" "\\"(অস্পষ্ট হলে পেরেনগুলিতে মোড়ানো) সংকলনের সময় একটি একক আক্ষরিক তৈরি করবে, যার প্রথম অংশটি কাঁচা, এবং কেবল শেষের ছোট্টটি অ-কাঁচা, পিছনে পিছনে প্রবেশের অনুমতি দেওয়ার জন্য।
শ্যাডোর্যাঞ্জার

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

3
তখন কাঁচা তারের কী লাভ? ধারণাটির ছায়াছবি বাস্তবায়নের মতো বলে মনে হচ্ছে।
ম্যাথু জেমস ব্রিগেস

101

পাইথনের কাঁচা স্ট্রিং সম্পর্কে পুরো ভুল ধারণাটি বেশিরভাগ লোকেরা মনে করেন যে ব্যাকস্ল্যাশ (একটি কাঁচা স্ট্রিংয়ের মধ্যে) কেবল অন্য সকলের মতো নিয়মিত চরিত্র। এইটা না. বোঝার মূল বিষয়টি হল এই অজগরটির টিউটোরিয়াল ক্রম:

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

সুতরাং একটি ব্যাকস্ল্যাশ নিম্নলিখিত কোন চরিত্র নেই কাঁচা স্ট্রিং এর অংশ। একবার পার্সার কোনও কাঁচা স্ট্রিং প্রবেশ করে (অ ইউনিকোড এক না) এবং একটি ব্যাকস্ল্যাশের মুখোমুখি হয় এটি 2 টি অক্ষর (একটি ব্যাকস্ল্যাশ এবং এটি অনুসরণকারী একটি চরিত্র) জানে)

এই পথে:

r'abc \ ঘ ' গঠিত A, B, C, \, ঘ

r'abc \ 'ঘ' গঠিত A, B, C, \ ', ঘ

r'abc \ '' গঠিত A, B, C, \ '

এবং:

r'abc \ ' গঠিত A, B, C, \,' কিন্তু এখন আর সসীম উদ্ধৃতি হয়।

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


8
এটি আসলে গৃহীত উত্তরের চেয়ে পরিষ্কার। দুর্দান্ত ব্রেকডাউন
ম্যাড পদার্থবিজ্ঞানী

4
আমি এটি গ্রহণযোগ্য উত্তরের চেয়েও উল্লেখযোগ্যভাবে পরিষ্কার দেখতে পেয়েছি এবং আমি একজন পদার্থবিদও
হয়েছি

22

এটা যে উপায়! অজগরকে আমি সেই ছোট্ট ত্রুটিগুলির মধ্যে একটি হিসাবে দেখছি!

আমি মনে করি না এর পক্ষে কোনও ভাল কারণ আছে তবে এটি অবশ্যই বিশ্লেষণ করছে না; শেষ চরিত্র হিসাবে raw এর সাথে কাঁচা স্ট্রিংগুলি পার্স করা সত্যিই সহজ।

ক্যাচটি হ'ল, যদি আপনি a কে কাঁচা স্ট্রিংয়ের শেষ চরিত্র হিসাবে থাকতে দেন তবে আপনি "কাঁচা স্ট্রিংয়ের ভিতরে রাখতে পারবেন না। মনে হয় অজগরকে" শেষ চরিত্র হিসাবে অনুমতি দেওয়ার পরিবর্তে "অনুমতি দিয়ে চলেছে।

যাইহোক, এটি কোনও ঝামেলা সৃষ্টি করা উচিত নয়।

আপনি যদি উইন্ডোজ ফোল্ডার প্যাটিগুলি সহজেই লিখতে না পারার বিষয়ে উদ্বিগ্ন হন c:\mypath\তবে উদ্বিগ্ন হবেন না, কারণ আপনি সেগুলি উপস্থাপন করতে পারেন r"C:\mypath"এবং যদি আপনাকে একটি উপ-ডিরেক্টরি নাম যুক্ত করার প্রয়োজন হয় তবে স্ট্রিং কন্টেটিংয়ের সাহায্যে এটি করবেন না for যাইহোক এটি করার সঠিক উপায় নয়! ব্যবহারos.path.join

>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'

2
ভাল আনুষঙ্গিক উপাদান। :-) শয়তানের উকিল, যদিও: কখনও কখনও আপনি পথের বিভাজককে সংযোজন করে ডিরেক্টরি পথ থেকে ফাইল পাথগুলি পৃথক করতে চান। Os.path.join সম্পর্কে দুর্দান্ত জিনিস হ'ল এটি তাদের ধস নেবে: দাবী করুন os.path.join ('/ home / cdleary /', 'foo /', 'bar /') == '/ home / cdleary / foo / বার / '
সিডলারি

যদিও এটি একটি (প্রযুক্তিগত) পার্থক্য করে না! os.path.isdir আপনাকে জানিয়ে দেবে যে কোনও নির্দিষ্ট পাথ ডিরেক্টরি (ফোল্ডার) কিনা
হেসেন

2
হ্যাঁ, কোডটি পড়ার জন্য কারও কাছে কেবল এটিই নির্দেশ করা যায় আপনি ডিরেক্টরি বা ফাইল হওয়ার কোনও পথ আশা করেন কিনা।
সিডলারি

উইন্ডোতে কনভেনশন হ'ল ফাইলগুলি সর্বদা বর্ধিত থাকে। সি: \ পথ \ ডেটা
হ্যাসেন

5
.. বা আপনি তাদের "সি: / মাইপাথ" হিসাবে উপস্থাপন করতে পারেন এবং আপনার ব্যাকস্ল্যাশ দুর্ভোগগুলি পুরোপুরি ভুলে যেতে পারেন :-)
জন ফুহি

14

স্ল্যাশ দিয়ে কাঁচা স্ট্রিংটি শেষ করার জন্য আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এই কৌশলটি ব্যবহার করতে পারেন:

>>> print r"c:\test"'\\'
test\

14

আর একটি কৌশল হ'ল chr (92) ব্যবহার করা যেমন এটি "\" এর মূল্যায়ন করে।

আমাকে সম্প্রতি ব্যাকস্ল্যাশগুলির একটি স্ট্রিং পরিষ্কার করতে হয়েছিল এবং নিম্নলিখিতটি কৌশলটি করেছিল:

CleanString = DirtyString.replace(chr(92),'')

আমি বুঝতে পারি যে এটি "কেন" এর যত্ন নেয় না তবে থ্রেডটি তাত্ক্ষণিক সমস্যার সমাধান অনুসন্ধান করতে বহু লোককে আকর্ষণ করে।


তবে যদি মূল স্ট্রিংটিতে ব্যাকস্ল্যাশ থাকে?
জোসেফ রেডফারন

2
ক্রিয়াকলাপ (92) অত্যন্ত অস্পষ্ট, সম্ভবত ব্যবহার করা আরও ভাল "\\"(ব্যাকস্ল্যাশ সহ অ-কাঁচা স্ট্রিং)
ক্লিমেপ

9

যেহেতু raw "কাঁচা স্ট্রিংয়ের অভ্যন্তরে অনুমোদিত। তারপরে এটি স্ট্রিংয়ের আখেরার শনাক্ত করতে ব্যবহার করা যাবে না।

আপনি যখন প্রথমটির মুখোমুখি হচ্ছেন তখন স্ট্রিংকে আক্ষরিক বিশ্লেষণ বন্ধ করবেন না কেন?

যদি এটি হয়, তবে স্ট্রিং আক্ষরিক ভিতরে \ "অনুমতি দেওয়া হত না But তবে তা।"


1
যথাযথভাবে। পাইথন ডিজাইনাররা সম্ভবত দুটি বিকল্পের স্বল্পতা মূল্যায়ন করেছেন: \"ডাবল-কোটেড কাঁচা স্ট্রিংয়ের মধ্যে যে কোনও জায়গায় দ্বি-চরিত্রের ক্রম , বা double ডাবল-কোটেড কাঁচা স্ট্রিংয়ের শেষে। ব্যবহারের পরিসংখ্যানগুলি অবশ্যই দুটি বর্ণের ক্রমটিকে বনাম যে কোনও স্থানেই শেষ করতে হবে।
hobs

3

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

তবে আপনি ব্যবহার করতে পারেন:

'\\'

4
'কেন' :-)
cdleary

2

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

আমি ভেবেছিলাম এটি একটি আকর্ষণীয় ধারণা এবং এটি উত্তরোত্তর সম্প্রদায়ের উইকি হিসাবে অন্তর্ভুক্ত করছি।


তবে এটি আপনাকে দুটি পৃথক স্ট্রিং-আক্ষরিক-পার্সার কোড পাথ এড়াতে দেয়।
সিডলারি

2

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


1

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

এটি প্রকৃতপক্ষে অস্বীকার করে না - কারণ এটি "পালিয়ে যাবে এবং পার্সারকে দম বন্ধ করে দেবে But তবে পূর্ববর্তী হিসাবে উল্লেখ করা legal বৈধ।


1
হ্যাঁ - ইস্যুটির কেন্দ্রস্থলটি ছিল কাঁচা স্ট্রিংগুলি একটি পালানোর ক্রমটি শুরু করার পরিবর্তে আক্ষরিক হিসাবে বিবেচনা করে। আশ্চর্যের বিষয় হ'ল এটিতে আক্ষরিক চরিত্র হিসাবে বিবেচিত হওয়া সত্ত্বেও উদ্ধৃতি দেওয়ার জন্য এটির পালানোর বৈশিষ্ট্য রয়েছে।
সিডলারি

1

কিছু টিপস :

1) যদি আপনাকে পাথের জন্য ব্যাকস্ল্যাশ চালনা করতে হয় তবে স্ট্যান্ডার্ড পাইথন মডিউল os.path আপনার বন্ধু। উদাহরণ স্বরূপ :

os.path.normpath ( 'C: / FOLDER1 /')

২) আপনি যদি নিজের স্ট্রিংয়ের শেষে ব্যাকস্ল্যাশ ছাড়াই এতে ব্যাকস্ল্যাশ দিয়ে স্ট্রিংগুলি তৈরি করতে চান তবে কাঁচা স্ট্রিংটি আপনার বন্ধু (আপনার আক্ষরিক স্ট্রিংয়ের আগে 'আর' উপসর্গটি ব্যবহার করুন)। উদাহরণ স্বরূপ :

r'\one \two \three'

3) যদি আপনার ব্যাকস্ল্যাশ সহ একটি ভেরিয়েবল এক্স-এ স্ট্রিং উপসর্গ করা দরকার হয় তবে আপনি এটি করতে পারেন:

X='dummy'
bs=r'\ ' # don't forget the space after backslash or you will get EOL error
X2=bs[0]+X  # X2 now contains \dummy

4) আপনার যদি শেষে ব্যাকস্ল্যাশ দিয়ে একটি স্ট্রিং তৈরি করতে হয় তবে টিপ 2 এবং 3 টি একত্রিত করুন:

voice_name='upper'
lilypond_display=r'\DisplayLilyMusic \ ' # don't forget the space at the end
lilypond_statement=lilypond_display[:-1]+voice_name

এখন lilypond_statement থাকে "\DisplayLilyMusic \upper"

দীর্ঘজীবী অজগর! :)

n3on


1
এগুলির কোনওটিই "কেন" এই প্রশ্নের উত্তর দেয় না, তবে # 3 এবং # 4 ব্যবহার করা উচিত নয়। স্ট্রিংগুলি কাটা এবং যুক্ত করা সাধারণত খারাপ অনুশীলন, এবং আপনার # 3 (যা ভাল কাজ করে) এবং '' .জয়েন ([r 'j ডিসপ্লেলিলি মিউজিক', r '\ আপার']) থেকে # 4 এর জন্য r '\ ডামি' পছন্দ করা উচিত।
সিডলারি

1
স্ট্রিংগুলি অপরিবর্তনীয় এবং প্রতিটি স্লাইস / কনটেনটেশন একটি নতুন পরিবর্তনযোগ্য স্ট্রিং অবজেক্ট তৈরি করে যা সাধারণত বাতিল করা হয় ason তাদের সকলকে একত্রিত করা এবং str.join (উপাদানসমূহ) এর সাথে এক ধাপে তাদের একসাথে যোগদান করা ভাল
সিডলারি

ওহ, উফ - আপনি # 3 এর অর্থ কী তা বোঝা গেল। আমি মনে করি একটি সরল '\\' + এক্স টুকরো টুকরো করার জন্য একটি স্ট্রিং তৈরি করতে পছন্দ করা হয়।
সিডলারি

কেবল সন্ধান os.path.normpathকরুন টেলিংয়ের ব্যাকস্ল্যাশ সরিয়ে ফেলবে ... তারপরে কীভাবে আমি ফাইলের নামটি পথের সাথে সংবহন করব ...
জিং

0

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

x = 'a string\\' 
x
'a string\\' 

# Now save it in a text file and it will appear with a single backslash:

with open("my_file.txt", 'w') as h:
    h.write(x)

আপনি যদি পাইথনের জসন লাইব্রেরি ব্যবহার করে এটি ফেলে দেন তবে বিটিডাব্লু এটি জসনের সাথে কাজ করছে না।

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

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