|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Переформатировать текстовую строку в понятное для AutoIT выражение |
|
[решено] Переформатировать текстовую строку в понятное для AutoIT выражение
|
Новый участник Сообщения: 7 |
Здравствуйте форумчане.Нужна помощь.
Есть текстовая строка Нужно ее переформатировать в надлежащий вид c двумя переменными $when = $haveoverpair and ($hand=99 or $hand=44) and ($totalinvested > $stacksize /100 * 120) $force = 'raisemax' и из участка строки raisemax force переформатировать в $force = 'raisemax' Может у вас будут какие-то свежие идеи.Смысл в следующем .Берем строку из текстового файла,ищем строку при решении которая выдает результат True и тогда мы выполняем действие стоящее перед словом force.Строки обсалютно разного содержания.Но в начале строки слово when обязательно. Вот не большой участок текстового файла when not BotRaisedBeforeFlop and bets=1 and raises>0 when (havestraightflush or havequads ) raisemax force when tripsonboard and NutFullHouseOrFourOfAKind=0 fold force when tripsonboard and NutFullHouseOrFourOfAKind>3 fold force when (havefullhouse or haveflush or havestraight or haveset) raisemax force when havetrips and HaveBestKicker raisemax force when haveoverpair and (hand=AA or hand=KK) raisemax force when (haveflushdraw or havestraightdraw) and overcards>0 raisemax force |
|
Отправлено: 16:51, 15-06-2011 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Так пойдёт:
Dim $aLines[9] = _ [ _ 'when haveoverpair and (hand=99 or hand=44) and totalinvested > 120% stacksize raisemax force', _ 'when not BotRaisedBeforeFlop and bets=1 and raises>0', _ 'when (havestraightflush or havequads ) raisemax force', _ 'when tripsonboard and NutFullHouseOrFourOfAKind=0 fold force', _ 'when tripsonboard and NutFullHouseOrFourOfAKind>3 fold force', _ 'when (havefullhouse or haveflush or havestraight or haveset) raisemax force', _ 'when havetrips and HaveBestKicker raisemax force', _ 'when haveoverpair and (hand=AA or hand=KK) raisemax force', _ 'when (haveflushdraw or havestraightdraw) and overcards>0 raisemax force' _ ] For $sLine In $aLines ConsoleWrite("===================================" & @LF & _AutoItParseLine($sLine) & @LF) Next Func _AutoItParseLine($sLine) Local $sOperators, $aLine, $aVars, $sRet $sOperators = 'and|or|not' ;Разделяем строку на две части. 1-ая это вся строка без двух последних переменных (на конце), а 2-ая это и есть последние две переменные (см. далее) $aLine = StringRegExp($sLine, '(?i)(.*?)(?: ([a-z_]+ [a-z_]+))?$', 3) ;Получаем все переменные в массив (! переменные не могут содержать числа) $aVars = StringRegExp($aLine[0], '(?i)([a-z_]+)', 3) ;Парсируем проценты (120%) $aLine[0] = StringRegExpReplace($aLine[0], '(\d+)% ([a-z_]+)', '(\2 / 100 * \1)') ;Парсируем первую переменную, присваиваем ей всё остальное выражение ("$when = ") $aLine[0] = StringRegExpReplace($aLine[0], '(?i)^(when )', '$\1= ') ;Оперделяем строку возврата (эта строка уже обрезана, и не содержит двух последних переменных) $sRet = $aLine[0] ;Если строка содержит на конце две переменные... If $aLine[1] <> '' Then ;Добавляем эти переменные в перевёрнутом порядке на новую строку $sRet &= @CRLF & StringRegExpReplace($aLine[1], '([a-z_]+) ([a-z_]+)$', "$\2 = '\1'") EndIf ;Проходимся по массиву переменных... For $sVar In $aVars ;Если это не оператор... If Not StringRegExp($sVar, '(?i)^(' & $sOperators & ')$') Then ;Добавляем к имени переменной символ $ $sRet = StringRegExpReplace($sRet, '\b(?<!\$)' & $sVar & '\b', '$' & $sVar, 1) EndIf Next ;Возвращаем полученную строку Return $sRet EndFunc ![]() |
------- Последний раз редактировалось Creat0R, 16-06-2011 в 10:02. Причина: Поправил код, + добавил комментарий Отправлено: 01:02, 16-06-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать Спасибо за ответ и новые идеи!!!У меня почему-то код ничего не выводит.Разбираюсь.
|
Отправлено: 07:03, 16-06-2011 | #3 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата PCLAlex:
|
|
------- Отправлено: 09:51, 16-06-2011 | #4 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать Сегодня весь день методом тыка все истыкал.Получается лажа.Посмотрите что смастерил.
$totalinvested = 150 $stacksize = 300 $haveoverpair = True $hand = "AK" $sString = 'when haveoverpair and (hand=AK or hand=44) and totalinvested>120% stacksize raisemax force' $aString = StringRegExp($sString,'(^\w+?\b)(.*)$',3);отделяем when $aFunc = StringRegExp($aString[1], '(?i)(.*?)(?: ([a-z_]+ [a-z_]+))?$', 3);разделяем forse + действие от основной строки $Forse = StringRegExpReplace($aFunc[1], '(\w+) ?(forse)', '"\1"');назначаем действие force (должно быть слово "raisemax" MsgBox(4096, Forse , $Forse ) $aFunc[0] = StringRegExpReplace($aFunc[0], '([=<>()%])', ' \1 ');добовляем пробелы к символам "=<>()%" MsgBox(4096, 'добовляем пробелы', $aFunc[0] ) $aFunc[0] = StringRegExpReplace($aFunc[0], '(\w+)', '$\1');добовляем знак "$" ко всем словам MsgBox(4096,' добовляем знак "$" ко всем словам', $aFunc[0] ) $aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\$(and|or|not)', '\1'); убираем знак "$" перд словами and|or|not MsgBox(4096, 'убираем знак "$" перд словами and|or|not' , $aFunc[0] ) $aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\ = \$?([a-z]+)', ' = \1'); убираем знак "$" у строковых переменных "hand" MsgBox(4096,'убираем знак "$" у строковых переменных', $aFunc[0] ) $aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)($hand = )(\w+)', '$hand = "\2"'); hand должо содержать строковую переменную " " (АК должно быть в ковычках) MsgBox(4096,'АК должно быть в ковычках', $aFunc[0] ) $aFunc[0] = StringRegExpReplace($aFunc[0], '(\w+[a-z]) ?([=<>]) ?(\d+) ?% (\w+[a-z_]+)', ' ( \1 \2 \4 / 100 * \3 )'); процент переводим в надлежащий вид MsgBox(4096, 'процент переводим в надлежащий вид', $aFunc[0] ) $when = Execute($aFunc[0]) MsgBox(0, 'Создали переменную '$Forse, $when) Цитата Creat0R:
|
||
Отправлено: 13:53, 16-06-2011 | #5 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата PCLAlex:
Замени на и не мучайся. |
|
------- Отправлено: 15:27, 16-06-2011 | #6 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать Не много отвлекся от проблемы и решение почти появилось!!!
$totalinvested = 600 $stacksize = 300 $haveoverpair = True $hand = "AK" $sString = 'when haveoverpair and (hand=AK or hand=44) and totalinvested>120% stacksize raisemax force' $aString = StringRegExp($sString,'(^\w+?\b)(.*)$',3);отделяем when $aFunc = StringRegExp($aString[1], '(?i)(.*?)(?: ([a-z_]+ [a-z_]+))?$', 3);разделяем forse + действие от основной строки $Forse = StringRegExpReplace($aFunc[1], '(\w+)(\h+)(force)', '"\1"');назначаем действие force (должно быть слово "raisemax" $aFunc[0] = StringRegExpReplace($aFunc[0], '(\h*)([=<>()%])(\h*)', ' \2 ');добовляем пробелы к символам "=<>()%" $aFunc[0] = StringRegExpReplace($aFunc[0], '([a-z_]+)', '$\1');добовляем знак "$" ко всем словам $aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\$(and|or|not)', '\1'); убираем знак "$" перд словами and|or|not $aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\ = \$?([a-z0-9]+\h+)', ' = \1'); убираем знак "$" у строковых переменных "hand" $aFunc[0] = StringRegExpReplace($aFunc[0], '(?i)\$(hand =) ?([a-z0-9]+)', '$hand = "\2"'); hand должо содержать строковую переменную " " (АК должно быть в ковычках) $aFunc[0] = StringRegExpReplace($aFunc[0], '\$([a-z_]+)\h+([=<>])\h+(\d+)\h+% \$(\w+[a-z_]+)', ' ( \1 \2 \4 / 100 * \3 )'); процент переводим в надлежащий вид $when = Execute($aFunc[0]) If $when = False Then MsgBox(0, 'Переменная $when ='& $Forse,"False") EndIf If $when = True Then MsgBox(0, 'Переменная $when ='& $Forse,"True") EndIf Creat0R огромное тебе спасибо!!!Я сегодня с твоей подачи написал свое первое регулярное выражение!!! У меня почему-то приходится править код после вставки из буфера.Это глюк только у меня?? |
Отправлено: 16:13, 16-06-2011 | #7 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата PCLAlex:
сразу видно что не все переменные преобразовываются. Прикрепил свой вариант (с учётом помещения значений переменных в кавычки). |
|
------- Отправлено: 18:12, 16-06-2011 | #8 |
Новый участник Сообщения: 7
|
Профиль | Отправить PM | Цитировать ![]() |
Отправлено: 06:58, 17-06-2011 | #9 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Как преобразовать текстовую формулу в числовой результат | malev | AutoIt | 2 | 18-09-2009 11:09 | |
[решено] Нужен скрипт для autoit для раскопирования файла | irk72ag | Автоматическая установка приложений | 3 | 19-06-2009 15:27 | |
Регулярное выражение для проверки денежной суммы | BuilderMan | Вебмастеру | 9 | 23-08-2006 11:24 | |
как уменьшить текстовую страницу? | OST | Вебмастеру | 2 | 17-01-2006 15:46 | |
переформатировать html | serg2002 | Вебмастеру | 5 | 16-09-2002 21:27 |
|