1 / 1 / 0
Регистрация: 27.03.2020
Сообщений: 18

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

27.09.2020, 19:01. Показов 2671. Ответов 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
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
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
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
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
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
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
8850 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru