REGEX - Automati c выбор текста и реструктуризация - PullRequest
0 голосов
/ 17 марта 2020

Я новичок в AHK, я написал несколько сценариев. Но с моим последним сценарием я застрял с REGEX в AHK. Я хочу сделать отчет о структуре текстов, которые я делаю.

Для этого я настроил систему:

  1. предложения, заканчивающиеся на '.', Являются важные предложения с "-". (переменная 'Vimportant'), НО БЕЗ слов, упомянутых для 'Vanecdotes2' или 'Vdelete2' cfr. 4
  2. предложения, заканчивающиеся на '. *', Являются анекдотами (переменная 'Vanecdotes1'), где я поставил звездочку вручную после точки.
  3. предложения, оканчивающиеся на «.!», Являются нерелевантными предложениями и должны быть удалены (переменная «Vdelete1»), где я поставил звездочку вручную после точки.
  4. дополнительная опция, которую я хочу реализовать, - это слова, которые нужно обнаружить в предложении, чтобы предложение автоматически добавлялось в переменную 'Vanecdotes2' или 'Vdelete2'

Случайный пример было бы это (я уже поставил! и * после предложения (почему это не важно) и из которых «приобретение» является примером op Vanecdotes2 из моего пункта 4 выше):

Последняя процедура 19/8 / 2019.

Normal structure x1.!  
Normal structure x2.!  
Abberant structure x3, needs follow-up within 2 months.  
Structure x4 is lower in activity, but still above p25.  
Abberant structure x4, needs follow-up within 6 weeks.  
Normal structure x5.  
Good aqcuisition of x6.  

Таким образом, вывод Regex в переменных должен быть

Last procedure on 19/8/2019.  
Normal structure x1.! --> regex  '.!' --> Vdelete1  
Normal structure x2.! --> regex  '.!' --> Vdelete1  
Abberant structure x3, needs follow-up within 2 months. --> Regex '.' = Vimportant  
Structure x4 is lower in activity, but still above p25.* --> regex '.*' = Vanecdote1  
Abberant structure x4, needs follow-up within 6 weeks. --> Regex '.' = Vimportant  
Normal structure x5.! --> regex  '.!' --> Vdelete1  
Good aqcuisition of x6. --> Regex 'sentence with the word acquisition' = Vanecdote2  

И вывод должен быть:

'- Last procedure on 19/8/2019.  
 - Abberant structure x3, needs follow-up within 2 months.  
 - Abberant structure x4, needs follow-up within 6 weeks.  

. Structure x4 is lower inactivity, but still above p25.  
. Good aqcuisition of x6.

Но у меня было много проблем с регулярным выражением, особенно с выбором предложений, заканчивающихся на * или! Но также и с критериями исключения, они просто не хотят этого делать.

Поскольку у AHT нет действительно хорошего тестера, я сначала протестировал его в другом тестере регулярных выражений, и я планировал «перевести» позже к AHK-коду .. но это просто не работает. (поэтому я знаю, что в приведенном ниже скрипте я использую язык AHK с регулярным выражением nonAHK, но я просто добавил для иллюстрации вместе)

Это то, что у меня сейчас есть:

Send ^c  
clipwait, 1000  
Temp := Clipboard  
Regexmatch(Temp, "^.*[.]\n(?!^.*\(Anecdoteword1|Anecdoteword2|deletewordX|deletewordY)\b.*$)", Vimportant)  
Regexmatch(Temp, "^.*[.][*]\n")", Vanecdotes1) 
Regexmatch(Temp, "^.*[.][!]\n")", Vdelete1)   
Regexmatch(Temp, "^.*\b(Anecdoteword1|Anecdoteword2)\b.*$")", Vanecdotes2)  
Regexmatch(Temp, "^.*\b(deletewordX|deletewordY)\b.*$")", Vdelete2)   
Vanecdotes_tot := Vanecdotes1 . Vanecdotes2  
Vdelete_tot := Vdelete1 . Vdelete2  
Vanecdotes_ster := "* " . StrReplace(Vanecdotes_tot, "`r`n", "`r`n* ")  
Vimportant_stripe := "- " . StrReplace(Vimportant, "`r`n", "`r`n- ")  
Vresult := Vimportant_stripe . "`n`n" . Vanecdotes_ster  

Для "перевода на AHK" я попытался сделать ^.*\*'n из рабочего (не ахк) регулярного выражения ^.*[.][*]\n.

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Это я был до сих пор, ничего не работает (я попробую предложенный l oop, когда Regex работает): ^ m :: BlockInput, On MouseGetPos,,, TempID, контроль WinActivate, ahk_id% TempID% if WinActive ("Pt.") Отправляет ^ c clipwait, 1000 Temp: = регулярное выражение буфера обмена (Temp, "(^ (?:. . \ n) ((?! PAX | PAC | Normaal | Geen).) $) ", Vimportant) Vimportant: = Vimportant.1 Regexmatch (Temp," (^. . * \ N) ", Vanecdotes1_ster) Regexmatch (Temp," (^. .! \ N ) ", Vdelete1_uitroep) Regexmatch (Temp," (^. \ b (PAX | PA C) \ b. $) ", Vanecdotes2) Regexmatch (Temp," (^. \ b (Normaal | Geen) \ b. $) ", Vdelete2) Vanecdotes1: = StrReplace (Vanecdotes1_ster,". ",". ") Vdelete1: = StrReplace (Vdelete1_uitroep,".! ",". ") Vanecdotes_tot: = Vanecdotes1. Vanecdotes2 Vdelete_tot: = Vdelete1. Vdelete2 Vanecdotes_ster: = "". StrReplace (Vanecdotes_tot, "r n", "r n *") Vimportant_stripe: = "-". StrReplace (Vimportant, "r n", "r n-") Результат: = Vimportant_stripe. "n n". Буфер обмена Vanecdotes_ster: = Vresult Отправить ^ v return

0 голосов
/ 18 марта 2020

Нет такого понятия, как регулярное выражение AHK. AHK в значительной степени использует PCRE, кроме параметров .
Так что не пытайтесь превратить перевод строки \n в перевод строки AHK `n.

И, кажется, в ваших регулярных выражениях есть некоторые синтаксические ошибки. Не совсем уверен, какими должны быть эти дополнительные "). Кроме того, вместо использования [.][*] вы должны использовать \.\*. \ требуется с этими указанными c символами, чтобы избежать их нормальной функциональности (любой символ и совпадение от нуля до неограниченного).
[] означает совпадение с любым символом в этой группе, например, если вы хотите сопоставить либо ., либо * вы бы сделали [.*].

И, похоже, у вас появилась идея использовать группы захвата, но на всякий случай вот минимальный пример с ними:

RegexMatch("TestTest1233334Test", "(\d+)", capture)
MsgBox, % capture

И, наконец, о вашем подходе к проблеме, я бы рекомендовал циклически проходить через входные данные. Это будет намного лучше / легче. Например, LoopParse.
Минимальный пример для этого:

inp := "
(
this is
a multiline
textblock
we're going
to loop
through it
line by line
)"

Loop, Parse, inp, `n, `r
    MsgBox, % "Line " A_Index ":`n" A_LoopField

Надеюсь, что это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...