কিভাবে একটি ব্যাকস্ল্যাশ-পলায়ন স্ট্রিং আন-পলায়ন?


104

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

>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>> 

তবে এর মধ্যে একটি (সম্ভবত অবিশ্বস্ত) স্ট্রিংটি (যা সম্ভবত একটি নিরাপত্তা ঝুঁকি) ( স্ট্যান্ডার্ড লিবে এমন কোনও ফাংশন আছে যা কোনও স্ট্রিং নেয় এবং কোনও সুরক্ষা জড়িত না দিয়ে স্ট্রিং উত্পাদন করে?

উত্তর:


140
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"

9
অজগর 3 এর সাথে সামঞ্জস্যপূর্ণ এমন কি কিছু আছে?
— thejinx0r

4
@ thejinx0r: এখানে উপর একটি চেহারা আছে: stackoverflow.com/questions/14820429/...
— ChristopheD

30
মূলত পাইথন 3 এর জন্য আপনি চানprint(b"Hello,\nworld!".decode('unicode_escape'))
— ক্রিস্টোফিড

4
অজগর 3 এর জন্য, ব্যবহার করুনvalue.encode('utf-8').decode('unicode_escape')
— কেসি কুবল

10
সতর্কতা: value.encode('utf-8').decode('unicode_escape') স্ট্রিং-এ-ASCII অক্ষরকে দূষিত করে । ইনপুটটিতে কেবল এএসসিআইআই অক্ষর থাকার নিশ্চয়তা না থাকলে এটি বৈধ সমাধান নয়।
— অ্যালেক্স পিটারস

35

আপনি ast.literal_evalনিরাপদ যা ব্যবহার করতে পারেন :

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

এটার মত:

>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!

4
স্ট্রিংটিতে একটি পালিয়ে থাকা আধা-কোলন থাকার ফলে এই কোডটি ভেঙে যায়। একটি বাক্য গঠন ত্রুটি "লাইনের ধারাবাহিকতা চরিত্রের পরে অপ্রত্যাশিত চরিত্র" ফেলে দেয়
— ডার্কস্কি

4
@ দার্কস্কি লক্ষ্য করুন যে astলাইব্রেরিতে আপনার পলায়ন_স্ট্রোরের চারপাশে উদ্ধৃতি (হয় "বা ', এমনকি """বা ''') প্রয়োজন, যেহেতু এটি আসলে এটি পাইথন কোড হিসাবে চালানোর চেষ্টা করছে তবে সুরক্ষা বাড়ায় (স্ট্রিং ইঞ্জেকশন প্রতিরোধ করে)
— ইনকিউ

@ no1xsyzy: ওপির ক্ষেত্রে ইতিমধ্যে কেসটি; এই সঠিক উত্তর যখন strএকটি হল reprA -এর strবা bytesওপি মামলার হিসেবে বস্তুর; unicode-escapeকোডেক উত্তর এটি না ক-এর জন্য হয় repr, কিন্তু পলান লেখার অন্য কোনো ধরনের (STRING তথ্য নিজেই অংশ হিসেবে কোট দ্বারা বেষ্টিত নয়)।
— শ্যাডোএ্যাঞ্জার

utf-8 অক্ষর সহ এটি কাজ করবে না। কোড প্যাকেজ সহ শেষ উত্তর চেকআউট করুন। এটা আসলে কাজ করে।
— রুবমজ

এফডাব্লুআইডাব্লু আমি কিছু পালিয়ে থাকা জেএসওএন পাঠ্যকে বিশ্লেষণের চেষ্টা করছিলাম এবং এই ত্রুটিটি পেতে থাকি [ERROR] TypeError: string indices must be integersএবং এই সমাধানটি এটি সমাধান করতে কাজ করে। স্ট্রিংটি আনসকেপ করুন, তারপরে JSON হিসাবে পার্স করুন।
— সাইবার-সন্ন্যাসী

21

প্রদত্ত সমস্ত উত্তরগুলি সাধারণ ইউনিকোড স্ট্রিংগুলিতে ভেঙে যায়। নীচেরটি পাইথন 3 এর জন্য সমস্ত ক্ষেত্রে কাজ করে, যতদূর আমি বলতে পারি:

from codecs import encode, decode
sample = u'mon€y\\nröcks'
result = decode(encode(sample, 'latin-1', 'backslashreplace'), 'unicode-escape')
print(result)

মন্তব্যে বর্ণিত হিসাবে, আপনি মডিউলটি literal_evalথেকে astতেমন পদ্ধতিটিও ব্যবহার করতে পারেন:

import ast
sample = u'mon€y\\nröcks'
print(ast.literal_eval(F'"{sample}"'))

অথবা এটির মতো যখন আপনার স্ট্রিংটিতে সত্যিকারের স্ট্রিং আক্ষরিক (কোটগুলি সহ) থাকে:

import ast
sample = u'"mon€y\\nröcks"'
print(ast.literal_eval(sample))

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


ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"পাইথন ৩..3.৩ এর সাথে আমার পক্ষে দুর্দান্ত কাজ করে
— ওলরিনব

মন্তব্য @oldrinb জন্য ধন্যবাদ! আমি অন্তর্ভুক্ত উত্তর সম্পাদনা।
— জেস্কো হ্যাটেনহেইন

14

অজগর 3 এ, strঅবজেক্টগুলির কোনও decodeপদ্ধতি নেই এবং আপনাকে একটি bytesঅবজেক্ট ব্যবহার করতে হবে । ক্রিস্টোফিডের উত্তরটি পাইথন 2 জুড়ে।

# create a `bytes` object from a `str`
my_str = "Hello,\\nworld"
# (pick an encoding suitable for your str, e.g. 'latin1')
my_bytes = my_str.encode("utf-8")

# or directly
my_bytes = b"Hello,\\nworld"

print(my_bytes.decode("unicode_escape"))
# "Hello,
# world"

4
এটি একসাথে রাখা value.encode('utf-8').decode('unicode_escape'),।
— কেসি কুবাল

6
দুঃখের সাথে বলতে হবে যদি স্ট্রিংটিতে কিছু utf-8 অ-
— এস্কি

আপনি কি কলটিতে পোলিশের জন্য উপযুক্ত কোনও এনকোডিং বাছাই করার চেষ্টা করেছেন encode?
— asachet

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