Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2021, 15:28   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию Замены в Пайтоне

подскажите пжл, отчего это происходит и как избавиться?
в результате после замен в результате   - в форме вставляется как квадратики, перевожу - SOH STX, это видно в консоли Пайчарма, в Блокноте++, Ворде
происходит такое в том числе при замене '(из) или (!)' на '\1 \2'
чем сие Питону не понравилось?
Код:
trepl = re.sub(r'((средств) или (!)|(вызванного) или (!)|(отношении) и (!)|(получении) и (!))', '\1 \2', trepl)
Ципихович Эндрю вне форума Ответить с цитированием
Старый 11.02.2021, 19:45   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

сорри, вот полный код-чтобы произвелась ошибка
Код:
import re

trepl = 'из или !другой'
trepl = re.sub(r'((из) или (!)|(вызванного) или (!)|(отношении) и (!)|(получении) и (!))', '\1 \2', trepl)
print(trepl)
в результате
другой - перед другой два квадратика, не вставляются в форму))
а ожидаю
из !другой
почему так происходит, как исправить? спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 11.02.2021, 20:51   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Во-первых, такая запись '\1 \2' воспринимается как экранированная последовательность, т.е. символы 'SOH STX' (Управляющие символы), так что нужно сделать r'\1 \2'. Во-вторых, это не поможет, так как группы в регэкспе нумеруются подряд, насколько знаю.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 11.02.2021, 21:01   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

так у меня полно замен примерно таких - и работают без указанной проблемы
Цитата:
Сообщение от BDA Посмотреть сообщение
Во-вторых, это не поможет, так как группы в регэкспе нумеруются подряд, насколько знаю
то есть тупик?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 11.02.2021, 21:07   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
import re

for s in ['из или !другой', 'вызванного или !другой']:
    s1 = re.sub(r'((из|вызванного) или|(отношении|получении) и) (!)', r'\g<2>\g<3> \g<4>', s)
    print(s1)
Не знаю, можно ли добиться одинакового номера у групп. Можно написать несколько номеров, раз все равно только один из них даст текст.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 14.02.2021, 12:17   #6
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

хелп, всё равно не доходит, код
Код:
import re
s = 'из или !другой'  
s1 = re.sub(r'((из) или (!))', r'\g<1> \g<2>', s)
print(s1)
для меня означает ищу текст 'из или !' - есть такой в s
s = 'из или !другой'
вот эту подкрашенную часть я должен заменить на группу 1 - 'из' пробел группа 2 - '!'
получится 'из !', а всё вместе 'из !другой' - почему не так?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 14.02.2021, 13:29   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

с предыдущим кодом разобрался
не понятно, почему
Код:
s1 = re.sub(r'(из|от) или (!)', r'\g<1> \g<2>', s)
работает
Код:
s1 = re.sub(r'((из) или (!)|(от) или (!))', r'\g<1> \g<2>', s)
НЕ работает, для меня это одно и тоже, делаю вывод из прочитанного в книге
Ципихович Эндрю вне форума Ответить с цитированием
Старый 14.02.2021, 21:51   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Потому что каждая пара скобок это своя группа:
1я группа - даст строку "из или !" или "от или !".
2я - "из" или пустая строка (пустая, начиная с Python 3.5 re).
3я - "!" или пустая строка.
4я - "от" или пустая строка.
5я - "!" или пустая строка.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 15.02.2021, 07:50   #9
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

очень понятно, спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 15.02.2021, 16:49   #10
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

сорри ещё возникла проблема
как стыкуются паттерны с переменной, у меня пока так и не работает))
Код:
f_text = "варвыарвыначалормивромирвоыарвыконецвапрапврпаврпварпаврав"
Начало, Конец = "начало", "конец"
special_part = re.sub(r'^(.*)' + Начало, '', f_text, re.I | re.DOTALL)
special_part = re.sub(Конец + '(.*)$', '', special_part, re.I | re.DOTALL)
в результате должно быть рмивромирвоыарвы, а может и одним махом можно это сделать?
спс
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замены программно Ципихович Эндрю Фриланс 10 18.03.2018 05:56
Метод замены V_I_P Общие вопросы C/C++ 1 12.11.2013 02:01
Замены Igorec Общие вопросы C/C++ 2 22.02.2010 20:15
Макрос пакетной замены swan1976 Microsoft Office Word 2 26.12.2009 17:48