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

Разделить строку

27.09.2020, 19:01. Показов 2658. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, у меня есть строка такого вида:

Кликните здесь для просмотра всего текста
166096734
2020-09-27 13:08:54
2020-09-27 13:08:54
1987-03-29
Андрей
РФ
166096735
2020-09-27 13:09:54
2020-09-27 13:09:54
1990-03-29
Дмитрий
Свой номер
РФ
166096736
2020-09-27 13:10:54
2020-09-27 13:10:54
2000-01-04
РФ


Мне нужно разделить этот тест на списки, но длинна кол-во строк всегда разная, и записи разные, то есть split('РФ') не подойдет.
Я думаю, разделить по ид(166096734) используя регулярное выражение, но с регулярками я ни разу не сталкивался.

Написал вот такой код:
Python
1
2
3
4
# Вышел код берет данные и передает сюда
def working(data, datas):
    x = re.split(r'(\d\d\d\d\d\d\d\d\d)', datas)
    print(x)
Но мне кажется, такая регугялка не хорошая. И он первый список выдает пустой:
['', '166096734', '\n2020-09-27 13:08:54\n2020-09-27 13:08:54\n1987-03-29\nАндрей\nРФ\n'

Подскажите, как мне лучше сделать? Что бы на выходе я получил список разделенный список
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.09.2020, 19:01
Ответы с готовыми решениями:

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

Разделить строку на списки
Добрый день помогите сделать несколько списков из строки, разделяя ее по длине слов то есть, список 1 = список 2 = и.тд

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

12
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.09.2020, 19:04
Цитата Сообщение от naripi6291 Посмотреть сообщение
разделить этот тест на списки,
На какие части ты хочешь разделить строку?
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.09.2020, 19:29
naripi6291, может так?
Python
1
2
3
4
5
6
7
8
9
mydict = {}
with open('text.txt') as in_file:
    for st in (line.rstrip() for line in in_file.readlines()):
        if "166" in st :
            key = st
            mydict[key] = mydict.get(key,[])
        else :
            mydict[key].append(st)
print(mydict)
0
1 / 1 / 0
Регистрация: 27.03.2020
Сообщений: 18
27.09.2020, 19:30  [ТС]
'166096734', '2020-09-27', '13:08:54', '2020-09-27', '13:08:54', '1987-03-29', 'Андрей', 'РФ'
На такие строки, от ид (набор из 7 цифр "166096734") до другого ид.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.09.2020, 20:24
Цитата Сообщение от naripi6291 Посмотреть сообщение
На такие строки, от ид
Включительно id? Или невключительно?
Если первое, то это задача найти подстроки, а не задача разделить по сепаратору.
Сепаратор выкидывается при разделении.
-----------------
Python
1
2
3
4
5
6
7
8
>>> for find in re.findall(r".+?РФ\n?",s, re.S):
    print(find.split())
 
    
['166096734', '2020-09-27', '13:08:54', '2020-09-27', '13:08:54', '1987-03-29', 'Андрей', 'РФ']
['166096735', '2020-09-27', '13:09:54', '2020-09-27', '13:09:54', '1990-03-29', 'Дмитрий', 'Свой', 'номер', 'РФ']
['166096736', '2020-09-27', '13:10:54', '2020-09-27', '13:10:54', '2000-01-04', 'РФ']
>>> >
Добавлено через 26 минут
Аналогичный результат дает и реализация своей собственной поисковой функции:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def findall(pattern, text):
    '''Возвращает слайс с нижней и верхней границей индексов вхождения подстроки
    '''
    start = 0
    len_p = len(pattern)
    overlap = len_p
    while True:
        start = text.find(pattern, start)
        if start == -1: return
        yield slice(start, start + len_p)
        start += overlap
 
        
start = 0
for slc in findall("РФ", s):
    print(s[start:slc.stop + 1].split())
    start = slc.stop + 1
1
1 / 1 / 0
Регистрация: 27.03.2020
Сообщений: 18
27.09.2020, 20:29  [ТС]
Нет, по "РФ" не подойдет. Я же уточнил, что будут разные строки. Поэтому я хотел по id, так как он всегда в начале и всегда одного типа
Кликните здесь для просмотра всего текста
166096734
2020-09-27 13:08:54
2020-09-27 13:08:54
1987-03-29
Андрей
Беларусь
166096735
2020-09-27 13:09:54
2020-09-27 13:09:54
1990-03-29
Дмитрий
Свой номер
Украина
166096736
2020-09-27 13:10:54
2020-09-27 13:10:54
2000-01-04
РФ


А когда я делал по id, то он мне выдает id как отдельный список
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.09.2020, 20:37
Цитата Сообщение от naripi6291 Посмотреть сообщение
Я же уточнил, что будут разные строки.
Но не привел их пример. Это плохой подход.
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.09.2020, 21:13
naripi6291,
Python
1
2
3
4
5
6
7
8
mylist = []
with open('text.txt') as in_file:
    for st in (line.rstrip() for line in in_file.readlines()):
        if "166" in st :
            mylist.append([st])
        else :
            mylist[-1].append(st)
print(mylist)
Так пойдет?
0
1 / 1 / 0
Регистрация: 27.03.2020
Сообщений: 18
27.09.2020, 21:36  [ТС]
Простите меня, пожалуйста. Я впервые задаю вопрос, в основном все искал в инете и в уроках.

Данные такого типа в виде строки:
Кликните здесь для просмотра всего текста
156045734
2020-09-29 13:08:54
2020-09-29 13:08:54
1987-03-29
Андрей
РФ
163090735
2020-09-25 13:09:54
2020-09-25 13:09:54
1990-03-29
Дмитрий
Свой_номер
Канада
166096736
2020-09-27 13:10:54
2020-09-27 13:10:54
2000-01-04
Беларусь


Мне нужно получить данные такого типа: (можно без id)
Кликните здесь для просмотра всего текста
['156045734', '2020-09-27', '13:08:54', '2020-09-29', '13:08:54', '1987-03-29', 'Андрей', 'РФ']
['166096736', '2020-09-27', '13:09:54', '2020-09-25', '13:09:54', '1990-03-29', 'Дмитрий', 'Свой_номер', 'Канада']
['166096736', '2020-09-27', '13:10:54', '2020-09-27', '13:10:54', '2000-01-04', 'Беларусь']


Код который я написал в теме разделяет id в один список, данные в другой список:
['', '166185046', '\n2020-09-27 14:31:05\n2020-09-27 14:31:05\......]
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.09.2020, 21:50
Лучший ответ Сообщение было отмечено naripi6291 как решение

Решение

naripi6291,
Python
1
2
3
4
5
6
7
8
mylist = []
with open('text.txt') as in_file:
    for st in (line.rstrip() for line in in_file.readlines()):
        if st.isdigit() and len(str(st)) == 9 :
            mylist.append([st])
        else :
            mylist[-1].extend(st.split())
print(mylist)
1
1 / 1 / 0
Регистрация: 27.03.2020
Сообщений: 18
27.09.2020, 22:09  [ТС]
А можно данные брать не из файла, а из переменной?
Я переделал код так:
Python
1
2
3
4
5
6
7
    mylist = []
    for st in (line.rstrip() for line in lst.split('\n')):
        if st.isdigit() and len(str(st)) == 9:
            mylist.append([st])
        else:
            mylist[-1].extend(st.split())
    print(mylist)
И твой и мой код разделяет по пробелам, то есть на выходе получается так:
'2020-09-27', '14:31:05', - а это должна быть одна строчка
0
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
27.09.2020, 22:12
Лучший ответ Сообщение было отмечено naripi6291 как решение

Решение

naripi6291, поменяй
Python
1
mylist[-1].extend(st.split())
На
Python
1
mylist[-1].append(st)
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.09.2020, 22:15
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def findall(pattern, text)-> slice:
    prev = None
    for  match in re.finditer(pattern, text):
        if  prev is None: 
            prev = match.span()
            continue
        current =  match.span()
        yield slice(prev[0], current[0])
        prev = current
     
    yield slice(prev[0],len(text))
 
for cls in findall("\d{9}", s):
    #print(s[cls].split()))  # если split  не нужен - можно убрать
    print(" ".join(s[cls].split())) # или сделать вот так
Code
1
2
3
156045734 2020-09-29 13:08:54 2020-09-29 13:08:54 1987-03-29 Андрей РФ
163090735 2020-09-25 13:09:54 2020-09-25 13:09:54 1990-03-29 Дмитрий Свой_номер Канада
166096736 2020-09-27 13:10:54 2020-09-27 13:10:54 2000-01-04 Беларусь

Цитата Сообщение от naripi6291 Посмотреть сообщение
код разделяет по пробелам,
Ты же сам написал, что тебе нужно чтобы найденный образец еще и разделялся по токенам.
Если тебе этого не нужно - убери split. Но тогда в строке останутся переводы строк. Но их можно легко удалить.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.09.2020, 22:15
Помогаю со студенческими работами здесь

Разделить строку на две
Всем привет! Есть строка значений через запятую: '0r,1q,2a,3f,4v,5c,6z,7d,8r,9p' Каким способом можно её разделить на две равные...

Разделить строку по символу
В птоне есть функция split(х) которая делит строку по символу х. Можно ли указать аргумент функции так, что строку будет разделена по всем...

Как разделить строку
Как можно разделить такую переменную- m = elektronnaya@mail.rupochta@yandex.comsila@gmail.com Что-бы получилось вот так- m =...

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

Как разделить строку на 6 частей
Имеется на выходе строка неопределенного размера + символов перевод строки. Нужно при помощи Python разделить ее на 6 частей? спасибо


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru