У меня есть текст, который я должен отсканировать, и каждая строка содержит как минимум 2, а иногда и четыре части информации. Проблема в том, что каждая строка может быть 1 из 15-20 разных действий.Каков наилучший способ разбора текста текста против нескольких (15+) регулярных выражений в каждой строке?
рубина текущий код выглядит примерно так:
text.split("\n").each do |line| #around 20 times.. .............. expressions['actions'].each do |pat, reg| #around 20 times .................
Это, очевидно, «ПРОБЛЕМА». Мне удалось сделать это быстрее (на C++ на 50%), объединив все regexen в один, но это все еще не такая скорость, которую мне нужно - мне нужно разобрать тысячи этих файлов FAST!
Прямо сейчас я сопоставляю их с регулярными выражениями - однако это невыносимо медленно. Я начал с Ruby и перешел на C++ в надежде, что я получу ускорение скорости, и этого просто не происходит.
Я случайно прочитал PEG и грамматический синтаксический анализ, но это выглядит несколько сложно. Является ли это направлением, в котором я должен руководствоваться, или существуют разные маршруты?
В основном я разбираю истории рук в покере, и каждая строка истории рук обычно содержит 2-3 бита информации, которую мне нужно собрать: , кем был игрок, сколько денег или какие карты влечет за собой действие. и т.д ..
Пример текста, который должен быть проанализирован:
buriedtens posts $5 The button is in seat #4 *** HOLE CARDS *** Dealt to Mayhem 31337 [8s Ad] Sherwin7 folds OneMiKeee folds syhg99 calls $5 buriedtens raises to $10
После того как я собирать эту информацию каждое действие превращена в узел XML.
Прямо сейчас моя реализация ruby намного быстрее, чем моя C++, но это проблема. Просто потому что я не написал в коде С в течение более 4-5 лет
UPDATE: Я не хочу, чтобы получить возможность отправлять весь код здесь, но до сих пор мои руки/второй выглядеть следующим образом:
588 hands/second -- boost::spirit in c++ 60 hands/second -- 1 very long and complicated regex in c++ (all the regexen put together) 33 hands/second -- normal regex style in ruby
В настоящее время я тестирую antlr, чтобы узнать, можем ли мы пойти дальше, но по состоянию на данный момент я очень доволен результатами духа.
Связанный вопрос: Efficiently querying one string against multiple regexes.
Можете ли вы предоставить несколько строк примера и какие действия следует предпринять для них? – Svante 2008-11-20 00:03:30
Согласен; нужно больше информации. Будет разница в зависимости от того, является ли ваша грамматика регулярной, контекстно-зависимой и т. Д. – porges 2008-11-20 00:11:58
Спасибо за отзыв и обновленный вопрос. – 2008-11-28 00:41:08