سؤال

PERL وبعض محركات Regex الحالية الأخرى تدعم خصائص Unicode، مثل الفئة، في Regex. على سبيل المثال في بيرل يمكنك استخدام \p{Ll} لتتناسب مع حرف صغير تعسفي، أو p{Zs} لأي فاصل الفضاء. لا أرى الدعم لهذا سواء في خطوط 2.x ولا 3.x من Python (مع الندم الواجب). هل أي شخص يدرك استراتيجية جيدة للحصول على تأثير مماثل؟ حلول محلية مرحب بها.

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

المحلول

هل حاولت Ponyguruma., ، ثابون ملزمة ل oniguruma. محرك التعبير العادي؟ في هذا المحرك يمكنك أن تقول ببساطة \p{Armenian} لتتناسب مع الشخصيات الأرمنية. \p{Ll} أو \p{Zs} العمل أيضا.

نصائح أخرى

ال regex. وحدة (بديل إلى المعيار re الوحدة النمطية) يدعم خصائص Codepoint Unicode مع \p{} بناء الجملة.

يمكنك استخدام Unicodatata بشدة على كل حرف:

import unicodedata

def strip_accents(x):
    return u''.join(c for c in unicodedata.normalize('NFD', x) if unicodedata.category(c) != 'Mn')

التحدث عن الحلول المنزلية، منذ بعض الوقت كتبت صغيرة برنامج للقيام بذلك فقط - تحويل فئة Unicode مكتوبة كما \p{...} في مجموعة من القيم، المستخرجة من Unicode تخصيص (v.5.0.0). فئات فقط مدعومة (على سبيل المثال: L, Zs)، ويقتصر على BMP. أنا نشرها هنا في حالة العثور على شخص مفيد (على الرغم من أن oniguruma يبدو خيارا أفضل حقا).

مثال على الاستخدام:

>>> from unicode_hack import regex
>>> pattern = regex(r'^\\p{Lu}(\\p{L}|\\p{N}|_)*')
>>> print pattern.match(u'疂_1+2').group(0)
疂_1
>>>

هنا مصدر. وبعد هنالك أيضا إصدار جافا سكريبت, باستخدام نفس البيانات.

أنت على حق أن تكون فئات خصائص Unicode غير مدعومة من Python Regex Parser.

إذا كنت ترغب في القيام باختراق لطيف، فسيكون ذلك مفيدا بشكل عام، فيمكنك إنشاء Preprocessor الذي يقوم بمسح سلسلة لهذه الرموز الفئة (\p{M} أو أيا كان) ويستبدلها بمجموعات الأحرف المقابلة، بحيث، على سبيل المثال، \p{M} قد يصبح [\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F], ، و \P{M} قد يصبح [^\u0300–\u036F\u1DC0–\u1DFF\u20D0–\u20FF\uFE20–\uFE2F].

الناس سوف شكرا لك. :)

لاحظ أنه على الرغم من \p{Ll} ليس لديه ما يعادل التعبيرات بايثون العادية، \p{Zs} يجب أن تكون مغطاة '(?u)\s'وبعد ال (?u), ، كما يقول المستندات، "make w، w، b، b، d، d، s ويعتمد على قاعدة بيانات خصائص حرف Unicode." و \s يعني أي شخصية تباعد.

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