اذهب إلى المحتوى

السؤال

نشر

أريد التعديل على نص وإستبدال كل علامة & موجودة فيه بالأحرف &\  ونفس الأمر بالنسبة لعدد من الرموز الأخرى مثل # و $ و @ يجب أن يتم إستبدالهم بالأحرف #\ و $\ و @\ على الترتيب:

يمكنني إستعمال التابع replace لإتمام هذا الأمر ولكن يجب إستدعائه يدويًا لكل رمز من هذه الرموز:

my_str = my_str.replace('@', '\@')
my_str = my_str.replace('$', '\$')
my_str = my_str.replace('%', '\%')
# ...

هل توجد طريقة أفضل لإتمام هذا الأمر بكود أقل في بايثون Python؟

Recommended Posts

  • 1
نشر

يمكنك استخدام الدالة maketrans التي تقبل تمرير قاموس فيه المفتاح هو المحرف الذي نريد استبداله و القيمة هي ما سوف نستبدله المفتاح به

print(s.maketrans( {'&': '\&', '#': '\#'} ))

s هي السلسلة الأصلية التي تريد التعديل في محارفها

  • 1
نشر

إليك حل  يفي بالغرض باستخدام التعبيرات النمطية أو بما يسمى regular expression :

import re

rep = {"condition1": "", "condition2": "text"} # ننشأ قاموس لتعريف المتغيرات

# ثم نطبق الفكرة 
rep = dict((re.escape(k), v) for k, v in rep.iteritems()) 
# ثم نجمع القيم
pattern = re.compile("|".join(rep.keys()))
# بعد ذلك نحولها لنص
text = pattern.sub(lambda m: rep[re.escape(m.group(0))], text)

وهناك حل بسيط :

def replace_all(text, dic):
    for i, j in dic.items():
        text = text.replace(i, j)
    return text
  • text : هو النص الذي تعمل عليه ويكون من نوع string
  • dic : قاموس يحتوي على key , value بحيث key هي القيمة المراد تبديلها و value هي القيمة الجديدة
  • 1
نشر

لإستبدال عدة أجزاء من النص وطبقاً لما هو مطلوب في سؤالك سنستعمل replace ولكن لن نكون بحاجة لإستدعاءها يدوياً, وإنما سنستعمل for للمرور على مصفوفة مسبقة التعريف تضم جميع القطع النصية المراد إستبدالها. تابع المثال التالي:

marks = ["@", "$", "#", "%"]
# نحصر جميع الرموز المراد إستبدالها في مصفوفة
text="We@are#good@people##just$like%you"
# نضع النص المطلوب معالجته في متغير وليكن النص أعلاه
for x in marks: # نستعمل أداة التكرار للمرور على جميع عناصر المصفوفة
   # x يمثل العنصر الحالي قيد المعالجة في أي دورة من حلقة التكرار
   text=text.replace(x, x+"\\") 
   #نستبدل العنصر الحالي في الدورة الحالية من التكرار بالقيمة المرغوبة
	print(text) # طباعة النص بعد معالجته
	#We@\are#\good@\people#\#\just$\like%\you
	# النص عند طباعته
	

تجدر الملاحظة أننا قمنا بعمل escape لقيمة النص المزادة عند الإستبدال وهي في حالة المثال "\" فأصبحت "\\" ذلك أن backslash أصلا نستعمله لعمل escaping. ما معناه إذا وضعنا x+"\" سيتم تخطي علامة التنصيص الخاصة بالنوع string ويتسبب بالتالي ب syntaxError.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...