Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102

Написать регулярное выражение

06.11.2022, 12:49. Показов 852. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо регулярное выражение для следующей лексемы

Строковая константа состоит из одной или нескольких частей, соединѐнных символом + . Каждая часть представляет собой последовательность символов, не содержащую апострофы, заключѐнную в апострофы, или последовательность символов, не содержащую кавычки, заключѐнную в кавычки. Все строковые константы имеют один и тот же тип лексемы, значение лексемы — последовательность символов, образованная конкатенацией всех частей лексемы без ограничивающих символов, заключѐнная в апострофы. Апостроф внутри части лексемы заменяется парой апострофов.

Написал только для определения строковой константы без + и внутренних кавычек:
Python
1
STR = r'"([^""]+)"'
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2022, 12:49
Ответы с готовыми решениями:

Написать регулярное выражение для float
ребят, возможно было уже, но я не нагуглил, суть - написать регулярное выражение для float но только, если в числе есть точка, пробую...

Написать регулярное выражение, определяющее является ли заданная строка правильным MAC-адресом
Написать регулярное выражение, определяющее является ли заданная строка правильным MAC-адресом. Пример правильного выражения:...

Написать регулярное выражение, определяющее является ли данная строка шестнадцатеричным идентификатором цвета в HTML
Напишите пожалуйста программу по данной задаче Написать регулярное выражение, определяющее является ли данная строка шестнадцатеричным...

14
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.11.2022, 13:16
Цитата Сообщение от labudaba Посмотреть сообщение
Необходимо регулярное выражение для следующей лексемы
Что должно делать это выражение? Поиск в тексте или проверка на полное совпадение?

Добавлено через 40 секунд
И вообще - примеры входных/выходных данных в студию
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
06.11.2022, 13:23
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Что должно делать это выражение? Поиск в тексте или проверка на полное совпадение?
Предполагаю, что вычислять значение константы.

Вот и примеры:
Code
1
2
3
4
5
var1
var1+var2
var1+'const2'
'const1'+'const2'+var3
"const1"+'const2'+var3+var4
Добавлено через 1 минуту
Ошибся, переменных нет. Тогда цель задания да: оптимизация строковых констант.
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.11.2022, 13:24
Рыжий Лис, я все равно не понял цели задачи.
Из "const1"+'const2' вернуть "const1const2" ???
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
06.11.2022, 13:27
Oracle 11 SQL
1
2
3
4
"const1"
"const1"+"const2"
"const1"+'const2'+"const3"
"Trixie's"+'is'+' BEST'' PONY'
Добавлено через 34 секунды
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Из "const1"+'const2' вернуть "const1const2" ???
да. Только без внешних кавычек. И убрать внутренние экранирования.

Добавлено через 2 минуты
Ещё пример с подвохом:
Oracle 11 SQL
1
"abc''def"
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.11.2022, 13:33
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
с подвохом
Таких подвохов можно найти немало, предусмотреть все регуляркой вряд ли выйдет. И чето сомнительно, что ТСу именно это надо.
А вцелом, прикольно такого монстра написать. Если не разбавить сплитом по плюсу...
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
06.11.2022, 13:38
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Если не разбавить сплитом по плюсу...
А ты не можешь разбить по плюсу, потому что плюс может быть внутри.

Oracle 11 SQL
1
"const1+const2"
Без регулярок:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def f(text):
    result = []
    i = iter(text)
    try:
        while True:
            char = i.__next__()
            # "(.?)"\+
            if char == '"':
                char = i.__next__()
                while char != '"':
                    result.append(char)
                    char = i.__next__()
                char = i.__next__()
                if char != '+':
                    raise ValueError(char)
                continue
            raise NotImplemented
    except StopIteration:
        return ''.join(result)
 
 
if __name__ == '__main__':
    assert f(r'''"const1"''') == "const1"
    assert f(r'''"const1"+"const2"''') == "const1const2"
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.11.2022, 13:40
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
А ты не можешь разбить по плюсу, потому что плюс может быть внутри.
Точно
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Без регулярок
Ээээ, неинтересно
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
06.11.2022, 14:08
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def f(text):
    result = []
    i = iter(text)
    try:
        while True:
            char = i.__next__()
            # "(.?)"
            if char == '"':
                char = i.__next__()
                while char != '"':
                    result.append(char)
                    char = i.__next__()
            # '(.?)'
            elif char == "'":
                char = i.__next__()
                while char != "'":
                    result.append(char)
                    char = i.__next__()
            else:
                raise ValueError(char)
            # +
            char = i.__next__()
            if char != '+':
                raise ValueError(char)
    except StopIteration:
        return ''.join(result)
 
 
if __name__ == '__main__':
    assert f(r'''"const1"''') == "const1"
    assert f(r'''"const1"+"const2"''') == "const1const2"
    assert f(r'''"const1"+'const2'+" const3"''') == "const1const2 const3"
Добавлено через 8 минут
Все примеры работают:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def f(text):
    result = []
    i = iter(text)
    try:
        while True:
            char = i.__next__()
            # "(.?)"
            if char == '"':
                char = i.__next__()
                while char != '"':
                    result.append(char)
                    char = i.__next__()
                char = i.__next__()
            # '(.?)'
            elif char == "'":
                char = i.__next__()
                # долбанное экранирование
                while True:
                    while char != "'":
                        result.append(char)
                        char = i.__next__()
                    char = i.__next__()
                    if char == "'":
                        result.append("'")
                        char = i.__next__()
                        continue
                    break
            else:
                raise ValueError(char)
            # +
            if char != '+':
                raise ValueError(char)
    except StopIteration:
        return ''.join(result)
 
 
if __name__ == '__main__':
    assert f(r'''"const1"''') == "const1"
    assert f(r'''"const1"+"const2"''') == "const1const2"
    assert f(r'''"const1"+'const2'+" const3"''') == "const1const2 const3"
    assert f(r'''"abc''def"''') == "abc''def"
    assert f(r'''"Trixie is"+' BEST'' '+"PONY"''') == "Trixie is BEST' PONY"
Добавлено через 17 минут
Не работает ваша регулярка:
Python
1
2
3
4
5
def f(text):
    rrr = r"(?:\"(.+?)\"|'(.+?)')"
    r = re.findall(r'^' + rrr + r'(?:\+' + rrr + r')*', text)[0]
    print(text, r)
    return ''.join(r)
Code
1
2
3
"const1" ('const1', '', '', '')
"const1"+"const2" ('const1', '', 'const2', '')
"const1"+'const2'+" const3" ('const1', '', ' const3', 'const2')
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.11.2022, 14:16

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
 
 
def foo(s: str)->str:
    return ''.join(re.findall(r'(?:(?<=")(?!\+?[\'"]).+?(?=\")|(?:(?<=\')(?!\+?[\'"]).+?(?=\')))', s))
 
 
assert foo(r'''"const1"''') == "const1"
assert foo(r'''"const1"+"const2"''') == "const1const2"
assert foo(r'''"const1"+'const2'+" const3"''') == "const1const2 const3"
assert foo(r'''"con+st1"+'con+st2'+" co+nst3"''') == "con+st1con+st2 co+nst3"
assert foo(r'''"con+st1"+'con+st2'+' co+nst3' ''') == "con+st1con+st2 co+nst3"
assert foo(r''''con+st1'+"con+st2"+' co+nst3' ''') == "con+st1con+st2 co+nst3"
assert foo(r'''"Trixie's"+'is'+' BEST'' PONY' ''') == "Trixie'sis BEST PONY"
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
06.11.2022, 14:18
Цитата Сообщение от iSmokeJC Посмотреть сообщение
assert foo(r'''"Trixie's"+'is'+' BEST'' PONY' ''') == "Trixie'sis BEST PONY"
Этот тест неправильный (для экранирования одинарной кавычки нужно её продублировать).

Цитата Сообщение от labudaba Посмотреть сообщение
Апостроф внутри части лексемы заменяется парой апострофов.
Oracle 11 SQL
1
"Trixie's"+'is'+' BEST'' PONY' -> "Trixie'sis BEST' PONY"
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.11.2022, 14:26
Лучший ответ Сообщение было отмечено labudaba как решение

Решение

А не дохрена ли задач на одну несчастную регулярку?

Добавлено через 3 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
"Trixie's"+'is'+' BEST'' PONY' -> "Trixie'sis BEST' PONY"
Ноу проблемо. Я наоборот, еле допер как от этого апострофа избавицца
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import re
 
 
def foo(s: str):
    return ''.join(re.findall(r'(?:(?<=")(?!\+[\'"]).+?(?=\")|(?:(?<=\')(?!\+[\'"]).+?(?=\')))', s))
 
 
assert foo(r'''"const1"''') == "const1"
assert foo(r'''"const1"+"const2"''') == "const1const2"
assert foo(r'''"const1"+'const2'+" const3"''') == "const1const2 const3"
assert foo(r'''"con+st1"+'con+st2'+" co+nst3"''') == "con+st1con+st2 co+nst3"
assert foo(r'''"con+st1"+'con+st2'+' co+nst3' ''') == "con+st1con+st2 co+nst3"
assert foo(r''''con+st1'+"con+st2"+' co+nst3' ''') == "con+st1con+st2 co+nst3"
assert foo(r'''"Trixie's"+'is'+' BEST'' PONY' ''') == "Trixie'sis BEST' PONY"
Добавлено через 2 минуты
ТС сдает преподу эту регулярку



2
4 / 4 / 1
Регистрация: 11.11.2020
Сообщений: 102
06.11.2022, 14:39  [ТС]
iSmokeJC, спасибо, выглядит монструозно... проще конечно было бы написать без регулярки буду разбираться
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
06.11.2022, 14:43
labudaba, разбираться в чужой регулярке - это вообще моветон
Тем более в такой.
Цитата Сообщение от labudaba Посмотреть сообщение
проще конечно было бы написать без регулярки
... тем более, что ее просто элементарно сломать
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
07.11.2022, 16:21
Цитата Сообщение от iSmokeJC Посмотреть сообщение
А не дохрена ли задач на одну несчастную регулярку?
Согласен, проще написать ДВЕ регулярки: одна разбивает по символу + на токены, а вторая уже без лишней головной боли парсит токен.

Добавлено через 11 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
t = '''
var1="const1"
var2="const1"+"const2"
var3="const1"+'const2'+" const3"
var4="con+st1"+'con+st2'+" co+nst3"
var5="con+st1"+'con+st2'+' co+nst3'
var6='con+st1'+"con+st2"+' co+nst3'
var7="Trixie's"+'is'+' BEST'' PONY'
'''
 
 
def f(m):
    print(m)
    return ''
 
 
r = r"(\".+?\"|'(:?.*?('')*.*?)+')"
print(re.sub(r + r'(:?\+' + r + r')*', f, t))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2022, 16:21
Помогаю со студенческими работами здесь

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

Регулярное выражение
Добрый день, помогите пожалуйста написать регулярное выражение для данных примеров ∗({8}+) 3+(3+5)∗(2+7) {3+345}∗+43

Регулярное выражение
Пытаюсь распарсить нестандартную строку, не пойму, что в регулярном выражении не так, почему не выводит последнее число. import re ...

Регулярное выражение
Создать регулярное выражение для заполнения поля по шаблону, например электронный адрес: логин@почта(сервер) домен: ppp@mail.ru. Если при...

Регулярное выражение
Добрый день! Не могу понять в чем ошибка import re test_str = regex = r'Улица\W\d+(-)|(\w*й)\Wросек' matches =...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru