Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
34 / 20 / 9
Регистрация: 29.08.2015
Сообщений: 87

Простая регулярка: все единичные "%" заменить на "%%"

11.06.2023, 16:03. Показов 752. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Подскажите пожалуйста, с простой регуляркой.

Python
1
2
3
4
5
import re
str1 = "test%and%and%%"
 
p = re.compile('[^%](%)[^%]')
print (p.sub('%%', str1))
на выходе хочу получить (все единичные "%" заменить на "%%"):

Python
1
test%%and%%and%%
Добавлено через 14 минут
Python
1
2
3
4
5
6
7
8
9
import re
str1 = "test%and%and%%"
 
p = re.compile('%')
str1 = p.sub('%%', str1)
p = re.compile('%{2,}')
str1 = p.sub('%%', str1)
 
print (str1)
Временно решил так, но это как-то глупо...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2023, 16:03
Ответы с готовыми решениями:

Регулярка, заменить все и за раз
Возможно ли при помощи .replace(, заменить за раз все что необходимо. К примеру один массив это то, что необходимо заменить, второй это на...

Поменять местами первый и последний элементы. Все единичные элементы массива заменить нулями
Люди добрые, помогите плиз с задачками. В массиве Р, размерности 150 150. поменять местами первый и последний элементы; все единичные...

Простая регулярка
Добрый день. С утра бьюсь над простой регуляркой, но что то никак не выходит. Если правильно понимаю то она должна быть такого вида...

11
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
11.06.2023, 18:28
Лучший ответ Сообщение было отмечено ivitaliy как решение

Решение

Python
1
print(re.sub(r'(?<!%)%(?!%)', '%%', str1))
2
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
11.06.2023, 19:01
Python
1
2
3
import regex as re
s = "test%and%and%%"
re.sub(r'(?<!%)(%)(?!\1)', r'\1\1', s)
Добавлено через 1 минуту
а, уже есть... но пусть будет с другим модулем
1
34 / 20 / 9
Регистрация: 29.08.2015
Сообщений: 87
11.06.2023, 22:46  [ТС]
Я так понял, в решении используется негативный lookahead и негативный lookbehind. Прежде о них не слышал, потому и пришел с вопросом. Спасибо iSmokeJC и YuS_2!

Добавлено через 2 часа 57 минут
Вариант без регулярных выражений:
Python
1
2
3
4
5
6
7
8
9
10
def double_char(ch,txt):
    n = 0
    for i in txt:
        if i==ch and txt[n-1]!=ch and txt[n+1]!=ch:
            txt2 = txt[n:]
            txt = txt[0:n] + ch
            txt = txt + txt2
            n += 1
        n += 1
    return txt
Добавлено через 17 минут
Проверил время выполнения кода на объеме входного текста в 10мб. Оказалось, что регулярка быстрее функции в 260 раз
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
11.06.2023, 22:54
ivitaliy, это потому, что у тебя функция свернеэффективная.
0
34 / 20 / 9
Регистрация: 29.08.2015
Сообщений: 87
11.06.2023, 23:22  [ТС]
Да, понимаю. Писал первое, что в голову пришло. Второй вариант медленнее регулярки уже в 80 раз

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def d_char(ch,txt):
    res = ""
    d = False
    for i in range(len(txt)):
        if txt[i]!=ch and d==True:
            res = res + ch + txt[i]
            d = False
        elif txt[i]==ch and d==False:
            res = res + txt[i]
            d = True
        else:
            res = res + txt[i]
            d = False
    return res
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
12.06.2023, 06:29
ivitaliy, еще так можно:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def double_symb(symb, txt):
    txt = list(txt)
    i = 0
    while i < len(txt):
        if (i == 0 or txt[i-1] != symb) and txt[i] == symb and (i == len(txt)-1 or txt[i+1] != symb):
            txt.insert(i, symb)
            i += 2
        i += 1
    return ''.join(txt)
 
s = '% % %% % %'
print(s)
print(double_symb('%', s))
1
34 / 20 / 9
Регистрация: 29.08.2015
Сообщений: 87
12.06.2023, 12:06  [ТС]
idealist, спасибо! Ваш вариант проигрывает в скорости выполнения регулярному выражению в 217 раз.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
12.06.2023, 12:18
дОжили...
Регулярка чемпион по скорости. Бугаг
1
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
12.06.2023, 13:20
ivitaliy, еще вариант:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def double_symb(symb, s):
    res = ''
    while(s):
        L, _, R = s.partition(symb)
        if (not L or L[-1] != symb) and (not R or R[0] != symb):
            res += L + symb * 2
            s = R
        else:
            res += L + symb + R[:1]
            s = R[1:]
    return res
 
s = '% % %% % %'
print(s)
print(double_symb('%', s))
0
34 / 20 / 9
Регистрация: 29.08.2015
Сообщений: 87
12.06.2023, 13:24  [ТС]
idealist, похоже, подсчет времени выполнения функции становится традицией для этой темы. Последний вариант функции занимает второе место после регулярки, на сей раз в 57 раз медленнее победителя.
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
12.06.2023, 13:53
Цитата Сообщение от ivitaliy Посмотреть сообщение
в 57 раз
Ну, из строковых методов, мне кажется, сильно меньше и не выжмешь..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.06.2023, 13:53
Помогаю со студенческими работами здесь

простая регулярка
Добрый день. Подскажите плиз регулярку для такого Есть текс, в котором есть такое Сумма: 1.00 RUB Какая регулярка нужна для того...

Простая регулярка
Здравствуйте! Не могу написать регулярку. Есть шаблон - user_id=. И нужно в строке тегов получить это число. Примеры строк где шаблон...

простая регулярка
есть $text = HTTP/1.1 302 Found Date: Tue, 04 Dec 2012 15:17:24 GMT Content-Type: text/html; charset=utf-8 Connection:...

не работает простая регулярка
Доброго времени суток! пишу следующий код: $content = file_get_contents('content.txt'); ...

Простая (наверное) регулярка
Добрый день! Нужно регулярным выражением вытащить начало строки до тех пор, пока не попадется хоть одна русская буква. Вот например...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru