سؤال

لدي برنامج نصي يوزع أسماء ملفات الحلقات التلفزيونية (show.name.s01e02.avi على سبيل المثال)، ويحصل على اسم الحلقة (من www.thetvdb.com API) ويعيد تسميتها تلقائيًا إلى شيء أجمل (Show Name - [01x02 ].افي)

يعمل البرنامج النصي بشكل جيد، وذلك حتى تحاول استخدامه على الملفات التي تحتوي على أسماء عرض Unicode (وهو أمر لم أفكر فيه أبدًا، نظرًا لأن جميع الملفات التي أملكها هي الإنجليزية، لذلك تقع جميعها في الغالب ضمن [a-zA-Z0-9'\-])

كيف يمكنني السماح للتعبيرات العادية بمطابقة الأحرف المحركة وما شابه ذلك؟يبدو حاليًا قسم التكوين الخاص بالتعبير العادي ..

config['valid_filename_chars'] = """0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@£$%^&*()_+=-[]{}"'.,<>`~? """
config['valid_filename_chars_regex'] = re.escape(config['valid_filename_chars'])

config['name_parse'] = [
    # foo_[s01]_[e01]
    re.compile('''^([%s]+?)[ \._\-]\[[Ss]([0-9]+?)\]_\[[Ee]([0-9]+?)\]?[^\\/]*$'''% (config['valid_filename_chars_regex'])),
    # foo.1x09*
    re.compile('''^([%s]+?)[ \._\-]\[?([0-9]+)x([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.s01.e01, foo.s01_e01
    re.compile('''^([%s]+?)[ \._\-][Ss]([0-9]+)[\.\- ]?[Ee]([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.103*
    re.compile('''^([%s]+)[ \._\-]([0-9]{1})([0-9]{2})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.0103*
    re.compile('''^([%s]+)[ \._\-]([0-9]{2})([0-9]{2,3})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
]
هل كانت مفيدة؟

المحلول

استخدم مجموعة فرعية من [\u0000-\uFFFF] على ما تريد.

يمكنك أيضًا استخدام re.UNICODE تجميع العلم. المستندات أقول ذلك إذا UNICODE تم ضبطه، \w سوف تتطابق مع الشخصيات [0-9_] بالإضافة إلى كل ما تم تصنيفه على أنه أبجدي رقمي في قاعدة بيانات خصائص أحرف Unicode.

أنظر أيضا http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html.

نصائح أخرى

وحدة إعادة بايثون لا تدعم \p{Letter} أو \X.ومع ذلك، تنفيذ regex الجديد على PyPI يفعل.

في إتقان التعبيرات العادية من جيفري فريدل (كتاب عظيم) ذكر أنه يمكنك استخدام \p{Letter} الذي سيطابق عناصر Unicode التي تعتبر حرفًا.

يبدو أن \X متاح كحرف كلمة عام في بعض اللغات، فهو يسمح لك بمطابقة حرف واحد بغض النظر عن عدد البايتات التي يشغلها.من الممكن ان يكون مفيدا.

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