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


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.