سؤال

أحاول حذف كل الأرقام من سلسلة.ومع ذلك التالي كود حذف وكذلك الأرقام الواردة في أي كلمة ، و من الواضح أنا لا أريد ذلك.لقد حاولت العديد من التعبيرات العادية مع أي نجاح.

وذلك بفضل!


s = "This must not b3 delet3d, but the number at the end yes 134411"
s = re.sub("\d+", "", s)
print s

النتيجة:

وهذا يجب أن لا ب deletd ، ولكن في النهاية نعم

هل كانت مفيدة؟

المحلول

وإضافة مسافة قبل \ د +.

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> s = re.sub(" \d+", " ", s)
>>> s
'This must not b3 delet3d, but the number at the end yes '

وتحرير: بعد النظر في التعليقات، وقرر تشكيل لإجابة أكثر دقة. وأعتقد أن هذا يمثل جميع الحالات.

s = re.sub("^\d+\s|\s\d+\s|\s\d+$", " ", s)

نصائح أخرى

وجرب هذا:

"\b\d+\b"

وهذا سوف تتطابق فقط تلك الأرقام التي ليست جزءا من كلمة أخرى.

وعن طريق \s ليست جيدة جدا، لأنه لا يعالج علامات التبويب، وآخرون. وأول خطوة من نوعها في أفضل حل هو:

re.sub(r"\b\d+\b", "", s)

لاحظ أن هذا النمط غير سلسلة الخام بسبب \b عادة الهروب مسافة للخلف سلاسل، ونريد كلمة الحدود خاص REGEX الهروب بدلا من ذلك. وهناك نسخة مربي الحيوانات قليلا هو:

re.sub(r"$\d+\W+|\b\d+\b|\W+\d+$", "", s)

وهذا يحاول إزالة الرائدة / زائدة بيضاء عندما تكون هناك أرقام في بداية / نهاية السلسلة. أقول "يحاول" لأنه إذا كان هناك أرقام متعددة في نهاية ثم لا يزال لديك بعض المساحات.

لمعالجة سلاسل أرقام في بداية السطر أيضا:

s = re.sub(r"(^|\W)\d+", "", s)

إذا كان الرقم الخاص بك هو دائما في نهاية سلاسل الخاص بك محاولة :re.الفرعية("\d+$", "", s)

وإلا, يمكنك محاولة re.الفرعية("(\s)\d+(\s)", "\1\2", s)

يمكنك ضبط الظهر-المراجع للحفاظ على واحد أو اثنين فقط من المساحات (\s مباراة أي أبيض فاصل)

وحل غير التعابير المنطقية:

>>> s = "This must not b3 delet3d, but the number at the end yes 134411"
>>> " ".join([x for x in s.split(" ") if not x.isdigit()])
'This must not b3 delet3d, but the number at the end yes'

والإنشقاقات التي كتبها " "، والشيكات إذا كان جزء هو رقم عن طريق القيام str().isdigit() ، ثم ينضم اليهم معا مرة أخرى. أكثر verbosely (لا تستخدم الفهم القائمة):

words = s.split(" ")
non_digits = []
for word in words:
    if not word.isdigit():
        non_digits.append(word)

" ".join(non_digits)

وأنا لا أعرف ما يبدو الوضع الحقيقي مثل، ولكن معظم الإجابات تبدو وكأنها لن التعامل مع الأرقام السالبة أو الكسور العشرية،

وre.sub(r"(\b|\s+\-?|^\-?)(\d+|\d*\.\d+)\b","")

وويجب فوق أيضا التعامل مع أشياء مثل،

و"هذا يجب أن لا delet3d B3، ولكن العدد في نهاية نعم -134،411"

ولكن هذا لا يزال غير مكتملة - وربما كنت في حاجة إلى تعريف أكثر اكتمالا من ما يمكنك أن تتوقع أن تجد في الملفات التي تحتاج إلى تحليل

وتحرير: انها الجدير بالذكر أيضا أن 'ب \' التغييرات اعتمادا على لغة / مجموعة الأحرف الذي تستخدمه لذلك عليك أن تكون حذرا قليلا مع أن

هل يمكن أن تحاول هذه

s = "This must not b3 delet3d, but the number at the end yes 134411"
re.sub("(\s\d+)","",s) 

والنتيجة:

'This must not b3 delet3d, but the number at the end yes'

وينطبق نفس القاعدة أيضا إلى

s = "This must not b3 delet3d, 4566 but the number at the end yes 134411" 
re.sub("(\s\d+)","",s) 

والنتيجة:

'This must not b3 delet3d, but the number at the end yes'
>>>s = "This must not b3 delet3d, but the number at the end yes 134411"
>>>s = re.sub(r"\d*$", "", s)
>>>s

و"هذا يجب أن لا delet3d B3، ولكن العدد في نهاية نعم"

وهذا سيزيل numericals في نهاية السلسلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top