Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326

Как собрать множество из строки слов, разделённых разными разделителями

05.02.2024, 18:48. Показов 2601. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Собственно вопрос в теме - как собрать множество из строки слов, разделённых разными разделителями?
Питон не понимает ? и \

Код из примера
Python
1
2
3
4
5
6
7
8
# Вводим строку с разными разделителями
input_string = "слово1?слово2\\слово3!"
 
# Разделяем строку по знакам вопроса, обратной косой черты и восклицательного знака
result = input_string.split('?\\!')
 
# Выводим результат
print(set(result))
Разделители не отсекает

Мой код тоже спотыкается - точнее не отсекает ? и \
Python
1
2
3
4
5
6
7
import re
instr = input("Введите множество A: ")
#print(set(re.split(";|,|", instr)))
#print(set(re.split('['.|,|;]', instr)))
#print(re.split('[ .,;:|/!]',instr))
print(set(instr.split(' .,;:|/!?\\')))
#print(set(instr))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.02.2024, 18:48
Ответы с готовыми решениями:

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

Есть текст, состоящий из слов, разделенных пробелами. Вам нужно найти слово с разными буквами
Нужно сделать через открытие файла #include <iostream> #include <sstream> #include <string> #include <algorithm> using...

Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым не совпал с...

29
 Аватар для Semen-Semenich
5232 / 3477 / 1175
Регистрация: 21.03.2016
Сообщений: 8,305
05.02.2024, 19:17
Python
1
2
3
4
5
6
7
8
9
# Вводим строку с разными разделителями
input_string = "слово1?слово2\\слово3!"
nev = ''
for i in input_string:
    if i.isalnum():
        nev += i
    else:
        nev += ' '
print(nev.split())
1
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
05.02.2024, 19:44  [ТС]
Semen-Semenich, не понимаю, что происходит от слова совсем.
И ещё - я же ввожу строку с клавиатуры, а у Вас готовая.
0
 Аватар для Semen-Semenich
5232 / 3477 / 1175
Регистрация: 21.03.2016
Сообщений: 8,305
05.02.2024, 20:03
Цитата Сообщение от jkom-18rus Посмотреть сообщение
И ещё - я же ввожу строку с клавиатуры
то есть вы даже не знаете основ?
Цитата Сообщение от jkom-18rus Посмотреть сообщение
не понимаю, что происходит от слова совсем
ну пару недель спокойного изучения основ и все станет как ясный день
2
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
05.02.2024, 21:09
Цитата Сообщение от jkom-18rus Посмотреть сообщение
Мой код тоже спотыкается
а как Вы этот код составляли?

Цитата Сообщение от jkom-18rus Посмотреть сообщение
точнее не отсекает ? и \
Python
1
2
3
4
import re
#s = "слово1?слово2\\слово3!"
s = input()
print(re.split(r'\?|\\\\|\\',s))
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,706
05.02.2024, 21:52
Python
1
2
3
4
5
6
7
seps = ('?', '\\', '!')
#s = input('->')
s = 'aaa?bbb\ddd!eee'
for se in seps:
    s = s.replace(se, ' ')
res = s.split()
print(set(res))
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38177 / 21112 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
05.02.2024, 22:00
Цитата Сообщение от jkom-18rus Посмотреть сообщение
Питон не понимает ? и \
- неужели?

Python
1
2
stri="sasas?hghgh?ghgh"
print(stri.split('?')) # печать ['sasas', 'hghgh', 'ghgh']
И вот:

Python
1
2
stri=input("s=")
print(stri.split('\\'))
Диалог:

s=qwer\yutr\\uiu
['qwer', 'yutr', '', 'uiu']

И что же здесь не так? Да, бэкслэш в строках Питона нужно удваивать.
0
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
06.02.2024, 18:02  [ТС]
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
то есть вы даже не знаете основ?
Я вижу его первый день. Пытаюсь что-то сделать.
Прошу понять и простить.

Цитата Сообщение от Semen-Semenich Посмотреть сообщение
ну пару недель спокойного изучения основ и все станет как ясный день
Согласен. Всё придёт с практикой.

Цитата Сообщение от YuS_2 Посмотреть сообщение
а как Вы этот код составляли?
гуглил и перебирал разные варианты (видите сколько неудачных строк закомментировано)

idealist и Catstail, вы показываете на примере одного конкретного разделителя, а у меня пул разных разделителей.

Цитата Сообщение от YuS_2 Посмотреть сообщение
print(re.split(r'\?|\\\\|\\',s))
видел подобную конструкцию, но не нашёл объяснения, как она работает.
Как мне её применить к моим всем разделителям { .,;:|/!?\\} ?

Добавлено через 4 минуты
За сегодня написал это
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
43
44
45
46
47
def vvod_mn(i):
    out_s = "Введите множество "
    out_s += i
    out_s += ":"
    print(out_s, end = ' ')
    in_s = input()
    return set(in_s.split())
 
def formula():
    set_f = (['A', 'B', 'C', '+', '-', '*', '/', 'a', 'b', 'c',' '])
    bool = False
    while not bool:
        f = input('Введите формулу: ')
        if f == '':
         print('Формула введена не правильно') 
         continue
        bool = True
        for i in range(len(f)):
         if not (f[i] in set_f):
          bool = False
         if not bool:
          break
        if not bool:
         print('Формула введена не правильно')  
  
sets_dict = {'A':set([]), 'B':set([]), 'C':set([])}
for i in "ABC":
 sets_dict[i] = vvod_mn(i)
 
sets_dict['A'] = {'1', '2', '3', '5', '7'}
sets_dict['B'] = {'1', '2', '3', '4', '6', '12', '18'}
sets_dict['C'] = {'1', '2', '3'}
print('Множество A:', sets_dict['A'])
print('Множество B:', sets_dict['B'])
print('Множество C:', sets_dict['C'])
 
print('Для ввода формулы используйте знаки:')
print('Объединение: "+"')
print('Пересечение: "*"')
print('Разность: "-"')
print('Симметрическая разность: "/"')
formula()
 
set_res = (sets_dict['A'] | sets_dict['B']) - sets_dict['C']
# print('A + B = ', set_res)
# set_res -= sets_dict['C']
print('A + B - C = ', set_res)
--------------------
Можно упростить эту конструкцию?
Python
1
2
3
4
5
 for i in range(len(f)):
         if not (f[i] in set_f):
          bool = False
         if not bool:
          break
Убрать условие if not bool, и проставить break, чтобы он осуществлял выход из цикла for. Типа нашли ошибку - вышли, зачем нам проверять строку дальше.

Задача: Написать программу, которая по заданным множествам А, В, С формирует множество, задаваемое формулой.
Предусмотреть возможность ввода исходных множеств и формулы с клавиатуры. Предусмотреть обработку ошибок: ввод одинаковых элементов множества, некорректный ввод формулы.

1) Исходные множества вводятся без проверок через пробел. -Хочу отсечь лишние символы (разделители, о которых тема)
2) Формула вводится, но не используется в программе. -Вопрос: Как введённую с клавиатуры строку перенести в код, чтобы операции происходили по введённой формуле? (думаю для этого надо создать отдельную тему на форуме)

Ещё одна особенность питона:
Python
1
set_res = (sets_dict['A'] | sets_dict['B']) - sets_dict['C']
В первом действии ставлю скобки, чтобы вычисления прошли правильно. Действия равнозначны и по идее должны идти по порядку, но почему-то без скобок сначала идёт вычитание, и соответственно ответ не верный. Почему?
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
06.02.2024, 19:25
Цитата Сообщение от jkom-18rus Посмотреть сообщение
Я вижу его первый день. Пытаюсь что-то сделать.
Цитата Сообщение от jkom-18rus Посмотреть сообщение
для этого надо
1. Изучить основы питона
2. Изучить регулярные выражения.

А это:
Цитата Сообщение от jkom-18rus Посмотреть сообщение
гуглил и перебирал разные варианты
пальцем в небо... а вдруг попадет...
Так не программируют... обычно... а необычно - это уже из области теории вероятностей... существует такая "теорема о бесконечных обезьянах", в смысле это не ругательство, она на самом деле существует, если интересно...
1
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
07.02.2024, 18:25  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
пальцем в небо
Ну не совсем. Я же конкретный запрос ищу

Что в итоге по моим вопросам?
Цитата Сообщение от jkom-18rus Посмотреть сообщение
Как мне её применить к моим всем разделителям { .,;:|/!?\\} ?
Цитата Сообщение от jkom-18rus Посмотреть сообщение
Можно упростить эту конструкцию?
Цитата Сообщение от jkom-18rus Посмотреть сообщение
В первом действии ставлю скобки, чтобы вычисления прошли правильно. Действия равнозначны и по идее должны идти по порядку, но почему-то без скобок сначала идёт вычитание, и соответственно ответ не верный. Почему?
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
07.02.2024, 18:56
Цитата Сообщение от jkom-18rus Посмотреть сообщение
Как мне её применить к моим всем разделителям { .,;:|/!?\\} ?
Python
1
re.split(r'[{ .,;:|/!?\\}]', s)
1
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
08.02.2024, 08:49
Цитата Сообщение от iSmokeJC Посмотреть сообщение
re.split(r'[{ .,;:|/!?\\}]', s)
Так будет разделение только по одному символу и например, такая строка:
Цитата Сообщение от jkom-18rus Посмотреть сообщение
"слово1?слово2\\слово3!"
- даст результат с "лишними", пустыми элементами.
Если требуется разделение по нескольким элементам, тут подойдет именно такой вариант:
Code
1
',\.\||\\\\|\\\?|[{ .,;:|/!?\\}]'
т.е. можно отделить набор нескольких символов (причем их надо помещать в начало) и сразу же символьный класс, но делить будет именно по одному из, если никакая группа не найдена...
Не знаю работают липроверил, атомарные группы в питоне работают, поэтому, чтобы уменьшить количество проверок/шагов движка, можно использовать атомарную группу:
Python
1
(?>,\.\||\\\\|\\\?|[{ .,;:|/!?\\}])
- в таком случае будет происходить захват по первому найденному по порядку из вариантов шаблона, без дальнейшей проверки всего шаблона (что значительно снижает шаги движка) и продвижение дальше по строке...
2
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.02.2024, 08:53
YuS_2,
Цитата Сообщение от YuS_2 Посмотреть сообщение
проверил, атомарные группы в питоне работают
Их недавно завезли, если не ошибаюсь. Осталось сверхжадные подтянуть и regex в стандартную либу интегрировать
0
Эксперт Python
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
08.02.2024, 09:58
Или:
Python
1
2
3
4
s = '.,;:|/!\?'
input_string = "слово1?слово2\\слово3!"
res = input_string.translate(str.maketrans(s, ' '*len(s))).split()
print(res)
1
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
08.02.2024, 10:08
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Их недавно завезли, если не ошибаюсь.
завезти-то завезли, но в некоторых случаях они работают необычно... надо читать документацию...

Цитата Сообщение от iSmokeJC Посмотреть сообщение
Осталось сверхжадные подтянуть
дык, вроде уже... с версии 3.11
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.02.2024, 10:09
Цитата Сообщение от YuS_2 Посмотреть сообщение
дык, вроде уже... с версии 3.11
Мдя. Отстал я...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
08.02.2024, 14:58
YuS_2, вижу вы часто регуляркой занимаетесь. Какой сайт посоветуете для их составления (слышал, что существуют сайты, которые упрощают жизнь)?
0
Любознательный
 Аватар для YuS_2
7405 / 2255 / 360
Регистрация: 10.03.2016
Сообщений: 5,216
08.02.2024, 15:29
Цитата Сообщение от Royal_X Посмотреть сообщение
Какой сайт посоветуете для их составления
"сайт" - в основном, в голове, в IDE и даже, просто в AkelPad-e... ну и часто в библию регулярок заглядываю, за авторством Дж.Фридла
а для проверки и расшаривания регэкспов именно, можно например https://regex101.com/ использовать... насколько он упростит жизнь - не знаю, но наглядность там есть, причем в разных диалектах. А, ещё иногда сюда заглядываю

Добавлено через 6 минут
Цитата Сообщение от YuS_2 Посмотреть сообщение
сюда
точнее, сюда
1
08.02.2024, 16:20

Не по теме:

YuS_2, спасибо

0
 Аватар для jkom-18rus
88 / 33 / 8
Регистрация: 26.02.2016
Сообщений: 326
08.02.2024, 19:49  [ТС]
YuS_2, спасибо за ответы.
Посмотрел видео про регулярки. Там можно использовать ключ \w, чтобы вообще остались только буквы, цифры и _. Это прям сильно упростит и, наверное, даст нужный результат.
Инфа осталась на работе. Сейчас дома так сходу не смогу проверить.
Может, подскажете готовую строку кода с \w?

И всё таки остальные вопросы остались.
Можно упростить эту конструкцию? Убрать условие if not bool, и проставить break, чтобы он осуществлял выход из цикла for. Типа нашли ошибку - вышли, зачем нам проверять строку дальше.
Python
1
2
3
4
5
 for i in range(len(f)):
         if not (f[i] in set_f):
          bool = False
         if not bool:
          break
Ещё одна особенность питона:
Python
1
set_res = (sets_dict['A'] | sets_dict['B']) - sets_dict['C']
В первом действии ставлю скобки, чтобы вычисления прошли правильно. Действия равнозначны и по идее должны идти по порядку, но почему-то без скобок сначала идёт вычитание, и соответственно ответ не верный. Почему?

Как введённую с клавиш формулу превратить в код нашёл, работает (функция eval()).

Добавлено через 5 минут
Цитата Сообщение от jkom-18rus Посмотреть сообщение
Можно упростить эту конструкцию?
Тупанул. Догадался. Просто:
Python
1
2
3
        for i in range(len(f)):
            if not (f[i] in set_char):
                break
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2024, 19:49
Помогаю со студенческими работами здесь

Сформировать текст из строки с разделителями и отсортировать его по количеству символов меж разделителями
Ввести массив символов разделителей с заданным количеством символов и массив строк текста, содержащий неизвестное заранее количество строк....

Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать три символа второй строки к первой
Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать три символа второй строки к первой. Поменять местами в измененной...

Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать три символа второй строки к первой
Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать три символа второй строки к первой. Поменять местами в измененной...

Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который перв
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым совпал с одним...

Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который перв
Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым не совпал с...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru