পাইথন স্ট্রিংয়ের রেগেক্স বিশেষ অক্ষরগুলি এড়িয়ে চলুন


126

পাইথনের কি কোনও ফাংশন রয়েছে যা আমি নিয়মিত অভিব্যক্তিতে বিশেষ অক্ষরগুলি থেকে বাঁচতে ব্যবহার করতে পারি?

উদাহরণস্বরূপ, I'm "stuck" :\হয়ে উঠতে হবেI\'m \"stuck\" :\\


2
কোন বিশেষ চরিত্র হিসাবে আপনি বিবেচনা করবেন?
পাফকু

1
সম্পূর্ণ আপনার প্রসঙ্গে নির্ভর করে। সাধারণত যখন আপনার কোনও স্ট্রিংয়ের ভিতরে থাকে তখন এই অক্ষরগুলি পুরোপুরি ঠিক থাকে।
অকর্মা

উত্তর:


197

ব্যবহার re.escape

>>> import re
>>> re.escape(r'\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape(r'\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com

এখানে এটি পুনরাবৃত্তি:

re.escape (STRING)

সমস্ত অ-অক্ষরসংখ্যক ব্যাকস্ল্যাশযুক্ত স্ট্রিং ফেরত দিন; আপনি যদি কোনও সালিসী আক্ষরিক স্ট্রিংয়ের সাথে এটির নিয়মিত এক্সপ্রেশন মেটাচার্যাকার থাকতে পারে তার সাথে মিল করতে চান তবে এটি কার্যকর।

পাইথন হিসাবে 3.7 re.escape()কেবলমাত্র অক্ষরগুলি পালাতে পাল্টানো হয়েছিল যা রেজেক্স অপারেশনগুলির জন্য অর্থপূর্ণ are


1
আপনি পুনরায় পরিবর্তে রেজেক্স মডিউল ব্যবহার করতে পারেন। একটি উদাহরণ হতে পারে regex.escape(pattern,string,special_only=True
লোকিনউ

17

আমি অবাক হয়েছি কেউ এর মাধ্যমে নিয়মিত এক্সপ্রেশন ব্যবহারের কথা উল্লেখ করেনি re.sub():

import re
print re.sub(r'([\"])',    r'\\\1', 'it\'s "this"')  # it's \"this\"
print re.sub(r"([\'])",    r'\\\1', 'it\'s "this"')  # it\'s "this"
print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"')  # it\'s\ \"this\"

গুরুত্বপূর্ণ বিষয়গুলি লক্ষ্য করুন:

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

9

Repr () [1: -1] ব্যবহার করুন। এই ক্ষেত্রে, ডাবল উদ্ধৃতি এড়ানো প্রয়োজন হয় না। [-1: 1] স্লাইসটি শুরুর এবং শেষ থেকে একক উদ্ধৃতি সরিয়ে ফেলা হয়।

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

অথবা হতে পারে আপনি কেবল আপনার প্রোগ্রামে পেস্ট করার জন্য একটি শব্দগুচ্ছটি এড়াতে চান? যদি তা হয় তবে এটি করুন:

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'

3
স্ট্রিংটি ইউনিকোড হলে এটি কাজ করে না, কারণ আপনার থাকতে হবে এবং চালানো উচিতrepr(x)[2:-1]
এন্টোইন পেলিস

পাইথন ৩.৪-এ, যেখানে সমস্ত স্ট্রিং ইউনিকোড রয়েছে, দুর্ভাগ্যক্রমে এটি মোটেও কাজ করে বলে মনে হচ্ছে না। পরিবর্তে, print(repr("I'm stuck")[1:-1])প্রিন্ট I'm stuck
ড্যান্টিস্টন

3

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

>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\\", ['"'])
I'm \"stuck\" :\\

1

এটি এতটা কঠিন নয়:

def escapeSpecialCharacters ( text, characters ):
    for character in characters:
        text = text.replace( character, '\\' + character )
    return text

>>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' )
'I\\\'m \\"stuck\\" :\\'
>>> print( _ )
I\'m \"stuck\" :\

3
যদি ব্যাকস্ল্যাশগুলির মধ্যে একটি হয় তবে charactersএটিই প্রথমটি হওয়ার চেয়ে ভাল ছিল!
স্টিভাহ

0

আপনি যদি কেবল কয়েকটি অক্ষর প্রতিস্থাপন করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.