كيفية توليد أمثلة من تعبير أشكال الجمع الجذعية؟ في بيثون؟

StackOverflow https://stackoverflow.com/questions/749170

سؤال

بالنظر إلى خط Gettext - أشكال الجمع، عامة قيم مثال على ذلك لكل منها n. وبعد أرغب في هذه الميزة لواجهة الويب لمترجمي موقعي، بحيث يعرفون شكل الجمع في المكان. على سبيل المثال، معطى:

"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

... أريد أن يتم تصنيف حقل النص الأول "1، 21 .."، ثم "2، 3، 4 ..."، ثم "5، 6 ..." (غير متأكد من ذلك ما إذا كان هذا صحيحا تماما، لكن انت فهمت الفكرة.)

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

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

المحلول

بالنظر إلى أنه في وقت متأخر، سوف يعض.

الحل التالي هو المخربقة، وتعتمد على تحويل النموذج الجمع الخاص بك إلى رمز بيثون الذي يمكن تقييمه (تحويل أساسا X؟ Y: بيانات Z إلى Python X و Y أو Z مكافئ، وتغيير && / || إلى و / أو في

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

# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4

p = "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"

# extract rule
import re
matcher = re.compile('plural=(.*);')
match = matcher.search(p)
rule = match.expand("\\1")

# convert rule to python syntax
oldrule = None
while oldrule != rule:
    oldrule = rule
    rule = re.sub('(.*)\?(.*):(.*)', r'(\1) and (\2) or (\3)', oldrule)

rule = re.sub('&&', 'and', rule)
rule = re.sub('\|\|', 'or', rule)

for n in range(40):
    code = "n = %d" % n
    print n, eval(rule)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top