التعامل مع الحركات في الأنماط التعريفية لبايثون؟

واحدة من المشكلات التي أواجهها أثناء التعامل مع الأنماط التعبيرية لبايثون (2.7 على الأقل) أنها تعتبر الحركات فاصلا للكلمة، ولذا فعند اختبار

re.findall(ur"\bأبو\b", u"أبوَاب")

فسيلتقط "أبو" في "أبوَاب".

يمكن التعلب على هذا العيب باستثناء الحركات:

re.findall(ur"\bأبو\b(?![ًٌٌٍَُِْ])", u"أبوَاب")

هل من وسيلة أخرى لتفادي العلة بطريقة أكفأ؟

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

ربما يكون الافضل لإستخراج الكلمات العربية بمطابقة نطاق الاحرف العربية في Unicode Arabic Block

arabic_patt = ur"[\u0600-\u06FF]+"

تعويضا عن \p{Block=Arabic}+ الغير مدعومة في المكتبة الاساسبة لبايثون ربما بوحدة مثل https://pypi.python.org/pyp... ولو أردت استبعاد الحركات أفضل أن تكون أيضا بنطاقها في اليونيكود

tashkeel_patt = ur"[\u0617-\u061A\u064B-\u0652]+"

مثلا

#-*- coding: utf-8  -*-

testWithTashkeel = u"الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ"


# == Using re
print "# == Using re"
import re
tashkeel_patt = ur"[\u0617-\u061A\u064B-\u0652]+"
arabic_patt = ur"[\u0600-\u06FF]+"

print "\n".join(re.findall(arabic_patt,testWithTashkeel))


if re.sub(tashkeel_patt,u"",testWithTashkeel) == "الحمد لله رب العالمين":
    print "tashkeel is omitted"


print 

# == Using regex
print "# == Using regex"

import regex
pattern = regex.compile(ur"\p{Block=Arabic}+")
print "\n".join(pattern.findall (testWithTashkeel))

هل من وسيلة للاستفادة من \b كما في مثال "أبوَاب"؟

يبدو لي أن مكتبة regex مفيدة هنا، أليس كذلك؟ من صفحتها:

The WORD flag changes the definition of a 'word boundary' to that of a default Unicode word boundary. This applies to \b and \B.

رائع، رائع إسلام. شكرا جزيلا! مجموعة لينكس الرياض محظوظة. ;)

العفو أخي أسامة