Вычисление в регулярных выражениях

sergiokapone
Posts: 51
Joined: 19.01.2017 15:33

Вычисление в регулярных выражениях

Post by sergiokapone »

Нужно найти

Code: Select all

строка <число>
и заменить

Code: Select all

строка <число+1>
Можно ли делать вычисления в Syn в регулярных выражениях? Или как написать плагин на python для Syn, чтобы делал такое?
Alexey
Posts: 1633
Joined: 05.10.2012 22:10

Post by Alexey »

В рег-выр так нельзя. Можно плагин. Читать весь текст- s=ed.get_text_all();
писать- ed.set_text_all(s);
заменять в s все вхождения- можно циклом или искать RegEx и менять что нашло руками.
если нашло <n> в позиции n1:n2, то-
s=s[:n1]+newtext+s[n2:]
User avatar
kvichans
Posts: 203
Joined: 07.10.2012 05:45

Post by kvichans »

@sergiokapone
Если вам это нужно сделать один раз, то достаточно действий в консоли. Если нужно будет многократно, то проще создать плагин.
Вот эти действия

Code: Select all

import re
text = ed.get_text_all()
text = re.sub(r'<([^>]+)>', lambda mo: str(1+int(mo.group(1))), text)
ed.set_text_all(text)
Это можно все ужать до одного вызова из консоли. А так как история вызовов сохраняется, то, может быть плагин и не нужен.

Code: Select all

import re; ed.set_text_all(re.sub(r'<([^>]+)>', lambda mo: str(1+int(mo.group(1))), ed.get_text_all()))
Нужны пояснения?
CudaText 1.163, TC9.51x32, Win10x64(1920x1080)
sergiokapone
Posts: 51
Joined: 19.01.2017 15:33

Post by sergiokapone »

kvichans wrote:Нужны пояснения?
Да.

Code: Select all

>>> text = ed.get_text_all()
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'ed' is not defined
ed не определено
http://i103.fastpic.ru/big/2018/0220/0b ... 0dee0b.png
Alexey
Posts: 1633
Joined: 05.10.2012 22:10

Post by Alexey »

В начале консоли надо было-
from sw import *
sergiokapone
Posts: 51
Joined: 19.01.2017 15:33

Post by sergiokapone »

А какие группу что задает? Мне нужно найти

Code: Select all

maparea "#7"
и заменить на

Code: Select all

maparea "#8"
User avatar
kvichans
Posts: 203
Joined: 07.10.2012 05:45

Post by kvichans »

sergiokapone wrote:
kvichans wrote:Нужны пояснения?
Да.
Хорошо
С учетом совета от Alexey код такой

Code: Select all

from sw import *
import re
text = ed.get_text_all()
text = re.sub(r'<([^>]+)>', lambda mo: str(1+int(mo.group(1))), text)
ed.set_text_all(text)
1. import-ы чтобы видеть объекты редактора и библиотеку РегВыр
2. text = ed.get_text_all() помещает в переменную text весь текст текущего таба
3. ed.set_text_all(text) заменяет весь текст текущего таба на значение переменной text
4. Дальше самое интересное
- re.sub(шаблон, как-заменять, где-заменять) - заменить все найденные по шаблону
- применяется шаблон с запоминанием подстроки - r'<([^>]+)>' - искать от "<", запоминать все что не ">", до ">"
- как-заменять - это лямбда-фукция, получающая информацию (mo имеет тип match object) об очередном найденном фрагменте.
- единственное выражение после "lambda mo:" (до следующей запятой) - это то, что функция вернет.
- из mo извлекается mo.group(1) - найденная подстрока (кстати mo.group(0) дает полный найденный фрагмент, вместе со <>) - это как раз цифры числа
- осталось из строки-цифр ссс составить новую строку-цифр: str(1+int(ссс))
CudaText 1.163, TC9.51x32, Win10x64(1920x1080)
User avatar
kvichans
Posts: 203
Joined: 07.10.2012 05:45

Post by kvichans »

Компактно, одной строкой это можно переписать так

Code: Select all

import sw,re; sw.ed.set_text_all(re.sub(r'<([^>]+)>', lambda mo: str(1+int(mo.group(1))), sw.ed.get_text_all()))
CudaText 1.163, TC9.51x32, Win10x64(1920x1080)
sergiokapone
Posts: 51
Joined: 19.01.2017 15:33

Post by sergiokapone »

Да, спасибо все ясно. Мне нужно было в

Code: Select all

(maparea "#7" "" (rect 3002 3971 34 56 ) (border #008000 ) ) (maparea "#9" "" (rect 3007 3774 35 56 ) (border #008000 ) ) (maparea "#12" "" (rect 2974 3683 68 57 ) ...
найти все "#7" и увеличить число на единицу.

сделал так

Code: Select all

import sw,re; sw.ed.set_text_all(re.sub(r'#(\d+)\"', lambda mo: str(1+int(mo.group(1))), sw.ed.get_text_all()))
Получается в mo.group(1) число 1 --- это то что в скобках r'#(\d+)\"', т.е. это \d+
User avatar
kvichans
Posts: 203
Joined: 07.10.2012 05:45

Post by kvichans »

Исправленный код моего примера

Code: Select all

import sw,re; sw.ed.set_text_all(re.sub(r'<([^>]+)>', lambda mo: '<'+str(1+int(mo.group(1)))+'>', sw.ed.get_text_all()))
Исправленный код вашего примера

Code: Select all

import sw,re; sw.ed.set_text_all(re.sub(r'#(\d+)\"', lambda mo: '#'+str(1+int(mo.group(1)))+'"', sw.ed.get_text_all()))
Вы вслед за мной упустили, что ответ из лямбды должен давать строку, заменяющую не mo.group(1), а mo.group(0), то есть весь найденный фрагмент
CudaText 1.163, TC9.51x32, Win10x64(1920x1080)
Post Reply