[python] استبدل أحرف غير ASCII بمسافة واحدة


Answers

بالنسبة لك الحصول على تمثيل متشابه للسلسلة الأصلية الخاصة بك ، أوصي وحدة unidecode :

from unidecode import unidecode
def remove_non_ascii(text):
    return unidecode(unicode(text, encoding = "utf-8"))

ثم يمكنك استخدامه في سلسلة:

remove_non_ascii("Ceñía")
Cenia
Question

أحتاج إلى استبدال جميع الأحرف غير ASCII (\ x00- \ x7F) بمسافة. أنا مندهش من أن هذا ليس سهلاً في بيثون ، ما لم أفقد شيئاً. تقوم الوظيفة التالية ببساطة بإزالة كل حروف غير ASCII:

def remove_non_ascii_1(text):

    return ''.join(i for i in text if ord(i)<128)

وهذا واحد يستبدل أحرف غير ASCII مع مقدار المسافات حسب كمية البايتات في نقطة رمز الحرف (أي يتم استبدال الحرف بـ 3 مسافات):

def remove_non_ascii_2(text):

    return re.sub(r'[^\x00-\x7F]',' ', text)

كيف يمكنني استبدال جميع أحرف ASCII بخلاف مساحة واحدة؟

Of myriad of questions SO similar ، none replacement character address opposed to stripping ، وبالإضافة إلى معالجة جميع أحرف غير ascii لا شخصية محددة.




إذا كان الحرف البديل يمكن أن يكون "؟" بدلاً من مسافة ، ثم أقترح result = text.encode('ascii', 'replace').decode() :

"""Test the performance of different non-ASCII replacement methods."""


import re
from timeit import timeit


# 10_000 is typical in the project that I'm working on and most of the text
# is going to be non-ASCII.
text = 'Æ' * 10_000


print(timeit(
    """
result = ''.join([c if ord(c) < 128 else '?' for c in text])
    """,
    number=1000,
    globals=globals(),
))

print(timeit(
    """
result = text.encode('ascii', 'replace').decode()
    """,
    number=1000,
    globals=globals(),
))

النتائج:

0.7208260721400134
0.009975979187503592



وبصفتك أسلوبًا أصليًا وفعالًا ، فلا تحتاج إلى استخدام أمر مُحدد أو أي حلقة فوق الأحرف. فقط قم بتشفير ascii وتجاهل الأخطاء.

سيؤدي ما يلي فقط إلى إزالة أحرف غير ascii:

new_string = old_string.encode('ascii',errors='ignore')

الآن إذا كنت تريد استبدال الأحرف المحذوفة ، قم بما يلي:

final_string = new_string + b' ' * (len(old_string) - len(new_string))



Links