Python optparse Экземпляр Значений

Ну, я слишком опаздывал на ответе для этого вопроса, но я работал немного сценария тестирования, который, кажется, работал очень хорошо на меня. Я использовал (простой, но ужасный, и большой) регулярное выражение для определения местоположения всех слов для меня. Выражение следующие:

(?<Value>(?:zero)|(?:one|first)|(?:two|second)|(?:three|third)|(?:four|fourth)|
(?:five|fifth)|(?:six|sixth)|(?:seven|seventh)|(?:eight|eighth)|(?:nine|ninth)|
(?:ten|tenth)|(?:eleven|eleventh)|(?:twelve|twelfth)|(?:thirteen|thirteenth)|
(?:fourteen|fourteenth)|(?:fifteen|fifteenth)|(?:sixteen|sixteenth)|
(?:seventeen|seventeenth)|(?:eighteen|eighteenth)|(?:nineteen|nineteenth)|
(?:twenty|twentieth)|(?:thirty|thirtieth)|(?:forty|fortieth)|(?:fifty|fiftieth)|
(?:sixty|sixtieth)|(?:seventy|seventieth)|(?:eighty|eightieth)|(?:ninety|ninetieth)|
(?<Magnitude>(?:hundred|hundredth)|(?:thousand|thousandth)|(?:million|millionth)|
(?:billion|billionth)))

Показанный здесь с разрывами строки для форматирования целей..

Так или иначе, мой метод должен был выполнить этот RegEx с библиотекой как PCRE и затем считать назад именованные соответствия. И это работало надо всеми различными примерами, перечисленными в этом вопросе, минус "Одна Половина", типы, поскольку я не включал их, но как Вы видите, не было бы трудно сделать так. Это решает много проблем. Например, это обращается к следующим объектам в исходном вопросе и других ответах:

  1. кардинал/номинал или ординал: "один" и "сначала"
  2. общие орфографические ошибки: "сорок" / "сорок" (Отмечают, что это ЯВНО не обращается к этому, которое было бы чем-то, которое Вы захотите сделать перед передачей строки этому синтаксическому анализатору. Этот синтаксический анализатор рассматривает этот пример как "ЧЕТЫРЕ"...)
  3. сотни/тысячи: 2100-> "две тысячи сто" и также "две тысячи сто"
  4. разделители: "одна тысяча сто пятьдесят два", но также и "elevenhundred fiftytwo" или "одна тысяча сто пятьдесят два" и этажерка
  5. colloqialisms: "человек тридцати с чем-то лет" (Это также не ПОЛНОСТЬЮ обращено, как, что такое "что-то"? Ну, этот код находит это число как просто "30"). **

Теперь, вместо того, чтобы сохранить этого монстра регулярного выражения в Вашем источнике, я рассматривал создание этого RegEx во времени выполнения, с помощью чего-то как следующее:

char *ones[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve",
  "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
char *tens[] = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
char *ordinalones[] = { "", "first", "second", "third", "fourth", "fifth", "", "", "", "", "", "", "twelfth" };
char *ordinaltens[] = { "", "", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth" };
and so on...

легкая часть здесь, мы только храним слова тот вопрос. В случае ШЕСТОГО Вы заметите, что нет записи для него, потому что это просто, это - нормальное число с TH, прикрепляемым на... Но как ДВЕНАДЦАТЬ потребностей другое внимание.

хорошо, поэтому теперь у нас есть код для создания нашего (ужасного) RegEx, теперь мы просто выполняем его на наших числовых строках.

Одна вещь, которую я рекомендовал бы, состоит в том, чтобы отфильтровать или съесть слово "И". Это не необходимо, и только приводит к другим проблемам.

Так, то, что Вы собираетесь хотеть сделать, установить функцию, которая передает именованные соответствия для "Величины" в функцию, которая смотрит на все возможные значения величины и умножает Ваш текущий результат на то значение величины. Затем Вы создаете функцию, которая смотрит на "Значение", названное соответствиями, и возвращает интервал (или независимо от того, что Вы используете), на основе значения, обнаруженного там.

Все соответствия ЗНАЧЕНИЯ ДОБАВЛЯЮТСЯ к Вашему результату, в то время как соответствия magnitutde умножают результат на значение mag. Так, Двести пятьдесят тысяч становится "2", тогда "2 * 100", тогда "200 + 50", тогда "250 * 1000", заканчиваясь с 250 000...

Только для забавы, я записал vbScript версию этого, и она работала отлично со всеми обеспеченными примерами. Теперь, это не поддерживает названные соответствия, таким образом, я должен был работать немного более трудное получение корректного результата, но я получил его. Нижняя строка, если это - соответствие "ЗНАЧЕНИЯ", добавьте его Ваш аккумулятор. Если это - соответствие величины, умножьте свой аккумулятор на 100, 1000, 1000000, 1000000000, и т.д... Это предоставит Вам некоторые довольно удивительные результаты и все, что необходимо сделать для корректировки для вещей как "одна половина", добавляют их к RegEx, вставляют маркер кода для них и обрабатывают их.

ну, я надеюсь, что это сообщение помогает КОМУ-ТО там. Если кто-либо хочет, я могу отправить vbScript псевдо кодом, что я раньше тестировал это с, однако, это не симпатичный код и НЕ производственный код.

, Если я могу.. Каков заключительный язык, в котором это будет записано? C++ или что-то как язык в виде сценария? Источник Greg Hewgill будет иметь большое значение в помощи, понимают, как все это объединяется.

Сообщенный мне, если я могу иметь какую-либо другую справку. Извините, я только знаю английский язык/Американца, таким образом, я не могу помочь Вам с другими языками.

50
задан bcat 17 November 2009 в 17:38
поделиться