পাইথনে কেস-সংবেদনশীল স্ট্রিং প্রতিস্থাপনের সবচেয়ে সহজ উপায় কী?
পাইথনে কেস-সংবেদনশীল স্ট্রিং প্রতিস্থাপনের সবচেয়ে সহজ উপায় কী?
উত্তর:
string
টাইপ এই সমর্থন করে না। আপনি সম্ভবত ব্যবহার বন্ধ ভাল আছেন রেগুলার এক্সপ্রেশন সাব পদ্ধতি সঙ্গে re.IGNORECASE বিকল্প।
>>> import re
>>> insensitive_hippo = re.compile(re.escape('hippo'), re.IGNORECASE)
>>> insensitive_hippo.sub('giraffe', 'I want a hIPpo for my birthday')
'I want a giraffe for my birthday'
'hippo'
, তবে কার্যকর হবে যদি প্রতিস্থাপনের মানটি কোনও ফাংশনে স্থানান্তরিত হয়, তাই এটি অন্য যে কোনও কিছুর চেয়ে সত্যিই আরও ভাল উদাহরণ।
re.escape
আপনার সুই, এখানে অন্য ফাঁদ যা এই উত্তর এড়াতে ব্যর্থ হয়, উল্লেখ করেন stackoverflow.com/a/15831118/1709587 : যেহেতু re.sub
প্রসেস সিকোয়েন্স অব্যাহতি, যেমন উল্লেখ করা docs.python.org/library/re.html#re .সুব , আপনার হয় প্রতিস্থাপনের স্ট্রিংয়ের সমস্ত ব্যাকস্ল্যাশগুলি থেকে বাঁচতে হবে বা ল্যাম্বডা ব্যবহার করতে হবে।
import re
pattern = re.compile("hello", re.IGNORECASE)
pattern.sub("bye", "hello HeLLo HELLO")
# 'bye bye bye'
re.sub('hello', 'bye', 'hello HeLLo HELLO', flags=re.IGNORECASE)
re.sub
পাইথন ২.7 থেকে কেবল এই পতাকাটিকে সমর্থন করে।
একক লাইনে:
import re
re.sub("(?i)hello","bye", "hello HeLLo HELLO") #'bye bye bye'
re.sub("(?i)he\.llo","bye", "he.llo He.LLo HE.LLO") #'bye bye bye'
অথবা, "চ্ছিক "পতাকা" যুক্তি ব্যবহার করুন:
import re
re.sub("hello", "bye", "hello HeLLo HELLO", flags=re.I) #'bye bye bye'
re.sub("he\.llo", "bye", "he.llo He.LLo HE.LLO", flags=re.I) #'bye bye bye'
বিফ্লোকের উত্তর অব্যাহত রেখে, এই ফাংশনটি একটি নয়, তবে পুরানো সমস্ত ঘটনাকেই সংবেদনশীল ফ্যাশনে পরিবর্তন করবে।
def ireplace(old, new, text):
idx = 0
while idx < len(text):
index_l = text.lower().find(old.lower(), idx)
if index_l == -1:
return text
text = text[:index_l] + new + text[index_l + len(old):]
idx = index_l + len(new)
return text
ব্লেয়ার কনরাডের মতো স্ট্রিং.রেপ্লেস এটি সমর্থন করে না।
রেজেক্স ব্যবহার করুন re.sub
তবে প্রথমে প্রতিস্থাপনের স্ট্রিংটি থেকে বাঁচতে ভুলবেন না। মনে রাখবেন যে ২.6 এর জন্য কোনও ফ্ল্যাগ-বিকল্প নেই re.sub
, সুতরাং আপনাকে এমবেডেড মডিফায়ার ব্যবহার করতে হবে '(?i)'
(বা একটি আরই-অবজেক্ট, ব্লেয়ার কনরাডের উত্তর দেখুন)। এছাড়াও, আরেকটি ক্ষতি হ'ল সাবটি প্রতিস্থাপন পাঠ্যে ব্যাকস্ল্যাশ পলায়নের প্রক্রিয়া করবে, যদি কোনও স্ট্রিং দেওয়া হয়। এটি এড়াতে পরিবর্তে একটি ল্যাম্বডায় যেতে পারে।
এখানে একটি ফাংশন:
import re
def ireplace(old, repl, text):
return re.sub('(?i)'+re.escape(old), lambda m: repl, text)
>>> ireplace('hippo?', 'giraffe!?', 'You want a hiPPO?')
'You want a giraffe!?'
>>> ireplace(r'[binfolder]', r'C:\Temp\bin', r'[BinFolder]\test.exe')
'C:\\Temp\\bin\\test.exe'
এই ফাংশনটি উভয় ব্যবহার str.replace()
এবং re.findall()
ফাংশন। এটা সব occurences প্রতিস্থাপন করবে pattern
মধ্যে string
দিয়ে repl
একটি কেস-অবশ উপায়।
def replace_all(pattern, repl, string) -> str:
occurences = re.findall(pattern, string, re.IGNORECASE)
for occurence in occurences:
string = string.replace(occurence, repl)
return string
এর জন্য রেগুলারএক্সপ প্রয়োজন হয় না
def ireplace(old, new, text):
"""
Replace case insensitive
Raises ValueError if string not found
"""
index_l = text.lower().index(old.lower())
return text[:index_l] + new + text[index_l + len(old):]
বাক্য গঠন বিশদ এবং বিকল্পগুলি সম্পর্কে একটি আকর্ষণীয় পর্যবেক্ষণ:
পাইথন ৩.7.২ (ট্যাগগুলি / v3.7.2: 9a3ffc0492, ডিসেম্বর 23 2018, 23:09:28) [এমএসসি v.1916 64 বিট (এএমডি 64)] উইন 32
import re
old = "TREEROOT treeroot TREerOot"
re.sub(r'(?i)treeroot', 'grassroot', old)
'তৃণমূল তৃণমূল তৃণমূল'
re.sub(r'treeroot', 'grassroot', old)
'তৃণমূল তৃণমূল ট্রেআরআউট'
re.sub(r'treeroot', 'grassroot', old, flags=re.I)
'তৃণমূল তৃণমূল তৃণমূল'
re.sub(r'treeroot', 'grassroot', old, re.I)
'তৃণমূল তৃণমূল ট্রেআরআউট'
সুতরাং ম্যাচের এক্সপ্রেশনটিতে (? I) উপসর্গ বা চতুর্থ যুক্তি হিসাবে "পতাকাগুলি = পুনরায় আইআই" যুক্ত করার ফলে কেস-সংবেদনশীল ম্যাচ হবে। কিন্তু, চতুর্থ যুক্তি হিসাবে কেবল "re.I" ব্যবহার করার ফলে কেস-সংবেদনশীল মিল পাওয়া যায় না।
তুলনার জন্য,
re.findall(r'treeroot', old, re.I)
['ট্রেইরোট', 'ট্রেয়ারুট', 'ট্রেয়ারআউট']
re.findall(r'treeroot', old)
[ 'Treeroot']
আমি পালানোর সিকোয়েন্সগুলিতে রূপান্তরিত হচ্ছিলাম না (কিছুটা নিচে স্ক্রোল করুন), তাই আমি উল্লেখ করেছি যে রি.সুব পালিয়ে যাওয়া চরিত্রগুলিকে সিকোয়েন্সগুলি থেকে পালাতে রূপান্তরিত করে।
এটি রোধ করতে আমি নিম্নলিখিত লিখেছি:
সংবেদনশীল কেস প্রতিস্থাপন।
import re
def ireplace(findtxt, replacetxt, data):
return replacetxt.join( re.compile(findtxt, flags=re.I).split(data) )
এছাড়াও, আপনি যদি এটিকে এখানে পাল্টানো অক্ষরের সাথে প্রতিস্থাপন করতে চান তবে অন্যান্য উত্তরগুলির মতো এখানেও বিশেষ অর্থ বাশল্যাশ অক্ষরগুলি পালানোর সিকোয়েন্সগুলিতে রূপান্তরিত হচ্ছে, কেবল আপনার সন্ধানটি ডিকোড করুন বা স্ট্রিং প্রতিস্থাপন করুন। পাইথন 3-তে, .ডিকোড ("ইউনিকোড_সেক্যাপ") # অজগর 3 এর মতো কিছু করতে হতে পারে
findtxt = findtxt.decode('string_escape') # python2
replacetxt = replacetxt.decode('string_escape') # python2
data = ireplace(findtxt, replacetxt, data)
পাইথনে ২.7.৮ পরীক্ষিত
আশা করি এইটি কাজ করবে.
এর আগে কখনও উত্তর পোস্ট করেনি এবং এই থ্রেডটি আসলেই পুরানো তবে আমি অন্য একতরফা দিয়ে হাজির হয়েছি এবং বুঝতে পেরেছি যে আমি আপনার দায়িত্ব পেতে পারি, পাইথন প্রোগ্রামিংয়ে আমি পাকা না তাই যদি এটির সামনে উপস্থিত কোনও ত্রুটি রয়েছে তবে দয়া করে এটিকে ভাল শিখার পরে উল্লেখ করুন: )
i='I want a hIPpo for my birthday'
key='hippo'
swp='giraffe'
o=(i.lower().split(key))
c=0
p=0
for w in o:
o[c]=i[p:p+len(w)]
p=p+len(key+w)
c+=1
print(swp.join(o))