আমার এমন একটি সমাধানের দরকার ছিল যেখানে স্ট্রিংগুলি প্রতিস্থাপন করা নিয়মিত প্রকাশ হতে পারে, উদাহরণস্বরূপ, একাধিক শ্বেত স্পেস অক্ষরকে একক দিয়ে প্রতিস্থাপন করে দীর্ঘ পাঠকে সাধারণকরণে সহায়তা করা। MiniQuark এবং mmj সহ অন্যদের কাছ থেকে জবাবের শৃঙ্খলে তৈরি করা, এটিই আমি এনেছি:
def multiple_replace(string, reps, re_flags = 0):
""" Transforms string, replacing keys from re_str_dict with values.
reps: dictionary, or list of key-value pairs (to enforce ordering;
earlier items have higher priority).
Keys are used as regular expressions.
re_flags: interpretation of regular expressions, such as re.DOTALL
"""
if isinstance(reps, dict):
reps = reps.items()
pattern = re.compile("|".join("(?P<_%d>%s)" % (i, re_str[0])
for i, re_str in enumerate(reps)),
re_flags)
return pattern.sub(lambda x: reps[int(x.lastgroup[1:])][1], string)
এটি অন্যান্য উত্তরে প্রদত্ত উদাহরণগুলির জন্য কাজ করে, উদাহরণস্বরূপ:
>>> multiple_replace("(condition1) and --condition2--",
... {"condition1": "", "condition2": "text"})
'() and --text--'
>>> multiple_replace('hello, world', {'hello' : 'goodbye', 'world' : 'earth'})
'goodbye, earth'
>>> multiple_replace("Do you like cafe? No, I prefer tea.",
... {'cafe': 'tea', 'tea': 'cafe', 'like': 'prefer'})
'Do you prefer tea? No, I prefer cafe.'
আমার কাছে প্রধান বিষয় হ'ল আপনি নিয়মিত ভাবগুলিও ব্যবহার করতে পারেন, উদাহরণস্বরূপ কেবলমাত্র পুরো শব্দ প্রতিস্থাপন করতে, বা সাদা স্থানকে স্বাভাবিক করতে:
>>> s = "I don't want to change this name:\n Philip II of Spain"
>>> re_str_dict = {r'\bI\b': 'You', r'[\n\t ]+': ' '}
>>> multiple_replace(s, re_str_dict)
"You don't want to change this name: Philip II of Spain"
যদি আপনি অভিধানের কীগুলি সাধারণ স্ট্রিং হিসাবে ব্যবহার করতে চান তবে আপনি একাধিক_ স্থানটি কল করার আগে যেমন এই ফাংশনটি ব্যবহার করতে পারেন তাদের থেকে রক্ষা পেতে পারেন:
def escape_keys(d):
""" transform dictionary d by applying re.escape to the keys """
return dict((re.escape(k), v) for k, v in d.items())
>>> multiple_replace(s, escape_keys(re_str_dict))
"I don't want to change this name:\n Philip II of Spain"
নীচের ফাংশনটি আপনার অভিধান কীগুলির মধ্যে ভুল নিয়মিত প্রকাশ খুঁজে পেতে সহায়তা করতে পারে (যেহেতু একাধিক_স্থান থেকে ত্রুটি বার্তাটি খুব একটা বলছে না):
def check_re_list(re_list):
""" Checks if each regular expression in list is well-formed. """
for i, e in enumerate(re_list):
try:
re.compile(e)
except (TypeError, re.error):
print("Invalid regular expression string "
"at position {}: '{}'".format(i, e))
>>> check_re_list(re_str_dict.keys())
মনে রাখবেন যে এটি প্রতিস্থাপনগুলিকে চেইন করে না, পরিবর্তে সেগুলি একই সাথে সম্পাদন করে। এটি এটি কী করতে পারে তা সীমাবদ্ধ না করে এটিকে আরও দক্ষ করে তোলে। শৃঙ্খলার প্রভাব নকল করতে, আপনাকে আরও স্ট্রিং-রিপ্লেসমেন্ট জোড় যুক্ত করতে হবে এবং জোড়গুলির প্রত্যাশিত ক্রমটি নিশ্চিত করতে হবে:
>>> multiple_replace("button", {"but": "mut", "mutton": "lamb"})
'mutton'
>>> multiple_replace("button", [("button", "lamb"),
... ("but", "mut"), ("mutton", "lamb")])
'lamb'