سؤال

لدي سلسلة UTF8 مع الجمع بين الرسوم. أريد أن أشارك مع \w تسلسل regex. إنه يطابق الشخصيات التي لها لهجات ، ولكن ليس إذا كان هناك حرف لاتيني مع الجمع بين العواصف.

>>> re.match("a\w\w\wz", u"aoooz", re.UNICODE)
<_sre.SRE_Match object at 0xb7788f38>
>>> print u"ao\u00F3oz"
aoóoz
>>> re.match("a\w\w\wz", u"ao\u00F3oz", re.UNICODE)
<_sre.SRE_Match object at 0xb7788f38>
>>> re.match("a\w\w\wz", u"aoo\u0301oz", re.UNICODE)
>>> print u"aoo\u0301oz"
aóooz

(يبدو أن معالج SO Markdown يواجه مشكلة في الجمع بين العلماء في ما سبق ، ولكن هناك ́ على السطر الأخير)

هل هناك على أي حال لمطابقة الجمع بين العلماء مع \w؟ لا أرغب في تطبيع النص لأن هذا النص من اسم الملف ، ولا أريد أن أفعل "اسم ملف Unicode" بالكامل. هذا هو بيثون 2.5.

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

المحلول

لقد لاحظت للتو جديدًا "Regex"حزمة على Pypi. (إذا فهمت بشكل صحيح ، فهي نسخة اختبار من حزمة جديدة ستحل محل Stdlib يومًا ما re حزمة).

يبدو أن لديها (من بين أشياء أخرى) المزيد من الاحتمالات فيما يتعلق بالحيوية. على سبيل المثال ، يدعم \X, ، والذي يتم استخدامه لمطابقة رسم بياني واحد (سواء كان يستخدم الجمع أم لا). كما أنه يدعم المطابقة على خصائص Unicode والكتل والبرامج النصية ، حتى تتمكن من الاستخدام \p{M} للإشارة إلى الجمع بين العلامات. ال \X المذكورة من قبل تعادل \P{M}\p{M}* (شخصية ليست علامة دمج ، تليها صفر أو أكثر من علامات الجمع).

لاحظ أن هذا يجعل \X أكثر أو أقل ما يعادل Unicode ., ، وليس من \w, ، لذلك في قضيتك ، \w\p{M}* هو ما تحتاجه.

إنها (في الوقت الحالي) حزمة غير Stdlib ، ولا أعرف مدى استعدادها (ولا تأتي في توزيع ثنائي) ، لكنك قد ترغب في تجربتها ، كما يبدو أنها كانت الإجابة الأسهل/الأكثر "الصحيحة" على سؤالك. (خلاف ذلك ، أعتقد أن لديك إلى استخدام نطاقات الأحرف بشكل صريح ، كما هو موضح في تعليقي على الإجابة السابقة).

أنظر أيضا هذه الصفحة من خلال معلومات حول التعبيرات العادية Unicode ، قد تحتوي ذلك أيضًا على بعض المعلومات المفيدة لك (ويمكن أن تكون بمثابة وثائق لبعض الأشياء التي تم تنفيذها في حزمة Regex).

نصائح أخرى

يمكنك استخدام Unicodedata.Normalize لتكوين الجمع بين العلماء في حرف واحد Unicode.

>>> import re
>>> from unicodedata import normalize
>>> re.match(u"a\w\w\wz", normalize("NFC", u"aoo\u0301oz"), re.UNICODE)
<_sre.SRE_Match object at 0x00BDCC60>

أعلم أنك قلت إنك لا ترغب في التطبيع ، لكنني لا أعتقد أنه ستكون هناك مشكلة في هذا الحل ، حيث أنك تطبيع فقط السلسلة لتتناسب معها ، ولا تضطر إلى تغيير اسم الملف نفسه أو شيء من هذا القبيل .

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