سؤال

أقوم بمطابقة المعرفات، ولكن لدي الآن مشكلة:يُسمح للمعرفات الخاصة بي أن تحتوي على أحرف Unicode.لذلك فإن الطريقة القديمة لفعل الأشياء ليست كافية:

t_IDENTIFIER = r"[A-Za-z](\\.|[A-Za-z_0-9])*"

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

كيف يمكنني مطابقة جميع أحرف Unicode مع python regexs وply؟هل هذه فكرة جيدة أيضًا على الإطلاق؟

أرغب في السماح للأشخاص باستخدام معرفات مثل Ω » « ° foo² väli π كمعرفات (أسماء متغيرة وما شابه) في برامجهم.تبا!أريد أن يتمكن الناس من كتابة البرامج بلغتهم الخاصة إذا كان ذلك عمليًا!على أية حال، يتم دعم الكود الموحد في الوقت الحاضر في مجموعة واسعة من الأماكن، ويجب أن ينتشر.

يحرر:يبدو أن فئات أحرف POSIX لا يتم التعرف عليها من خلال تعبيرات python regexes.

>>> import re
>>> item = re.compile(r'[[:word:]]')
>>> print item.match('e')
None

يحرر:لشرح ما أحتاجه بشكل أفضل.سأحتاج إلى regex - الشيء الذي يطابق جميع أحرف Unicode القابلة للطباعة ولكن ليس أحرف ASCII على الإطلاق.

يحرر:r"\w" يفعل بعض الأشياء التي أريدها، لكنه لا يتطابق مع « »، وأحتاج أيضًا إلى تعبير عادي لا يتطابق مع الأرقام.

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

المحلول

إعادة تدعم وحدة و\ ث جملة منها:

<اقتباس فقرة>   

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

وبالتالي فإن الأمثلة التالية توضح كيفية تطابق معرفات يونيكود:

>>> import re
>>> m = re.compile('(?u)[^\W0-9]\w*')
>>> m.match('a')
<_sre.SRE_Match object at 0xb7d75410>
>>> m.match('9')
>>> m.match('ab')
<_sre.SRE_Match object at 0xb7c258e0>
>>> m.match('a9')
<_sre.SRE_Match object at 0xb7d75410>
>>> m.match('unicöde')
<_sre.SRE_Match object at 0xb7c258e0>
>>> m.match('ödipus')
<_sre.SRE_Match object at 0xb7d75410>

وهكذا التعبير الذي ننظر اليه هو: [^ \ W0-9] \ ث *

(ش؟)

نصائح أخرى

وتحتاج إلى تمرير reflags تمرير المعلمة في lex.lex:

lex.lex(reflags=re.UNICODE)

تحقق من إجابات هذا السؤال

تجريد الأحرف غير القابلة للطباعة من سلسلة في بايثون

ستحتاج فقط إلى استخدام فئات أحرف Unicode الأخرى بدلاً من ذلك

وحلها بمساعدة فينكو.

وأدركت أن الحصول على مجموعة يونيكود هو البكم سهل. ولذا فإنني سوف قيام بذلك:

symbols = re.escape(''.join([chr(i) for i in xrange(33, 127) if not chr(i).isalnum()]))
symnums = re.escape(''.join([chr(i) for i in xrange(33, 127) if not chr(i).isalnum()]))

t_IDENTIFIER = "[^%s](\\.|[^%s])*" % (symnums, symbols)

وأنا لا أعرف عن classses حرف unicode. إذا بدأ هذه الاشياء يونيكود الحصول معقدة للغاية، ويمكنني أن مجرد وضع نسخة أصلية واحدة في المكان. UTF-8 الدعم لا يزال يضمن الدعم على على الرموز STRING، الذي هو أكثر أهمية.

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

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