Текст в CSV во вложенных списках для нескольких разделителей (пропуская первое вхождение) - PullRequest
1 голос
/ 21 мая 2019

Мои данные выглядят так:

[['15/09/16, 12:21 pm - User1: Hey'],
 ['15/09/16, 12:22 pm - User2: <Media omitted>'],
 ["15/09/16, 12:22 pm - User2: It's yesterday's work"],
 ['15/09/16, 12:22 pm - User1: Gotta work on it.']]

Я пытаюсь разделить этот вложенный список на каждый столбец Дата, Время, Имя пользователя, Сообщение.

Теперь мои разделители

, для разделения даты,

- для разделения времени,

: для разделения имени пользователя и сообщения

Но проблема в том, если я использую:, он также разделит Время, поскольку оно имеет формат XX:XX.

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

Попытка 1 - Я пытался разделить данные напрямую во время чтения, но ничего не изменилось.

delim=",","-",":"
regexPattern = '|'.join(map(re.escape, delim))
data = []
for line in open('/content/drive/My Drive/sample.txt'):
    items = line.rstrip('\r\n').split(regexPattern)   # strip new-line characters and split on column delimiter
    items = [item.strip() for item in items]  # strip extra whitespace off data items
    data.append(items)

Попытка 2 - Я пыталсяsplit при записи в csv

delim=",","-",":"
regexPattern = '|'.join(map(re.escape, delim))
with open('output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    re.split(regexPattern,data)
    writer.writerows(data)

Это приводит к ошибке, так как split ожидает строку и у меня есть список.Не уверен, как достичь своей главной цели.

Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 21 мая 2019

Шаблон использования re.compile(r",|\-|\:\s+")

Пример:

import re
data = [['15/09/16, 12:21 pm - User1: Hey'],
 ['15/09/16, 12:22 pm - User2: <Media omitted>'],
 ["15/09/16, 12:22 pm - User2: It's yesterday's work"],
 ['15/09/16, 12:22 pm - User1: Gotta work on it.']]


regexPattern = re.compile(r",|\-|\:\s+")
for i in data:
    for j in i:
        print(regexPattern.split(j))

Выход:

['15/09/16', ' 12:21 pm ', ' User1', 'Hey']
['15/09/16', ' 12:22 pm ', ' User2', '<Media omitted>']
['15/09/16', ' 12:22 pm ', ' User2', "It's yesterday's work"]
['15/09/16', ' 12:22 pm ', ' User1', 'Gotta work on it.']

Использование группировки Regex.

Демонстрация:

import re
data = [['15/09/16, 12:21 pm - User1: Hey'],
 ['15/09/16, 12:22 pm - User2: <Media omitted>'],
 ["15/09/16, 12:22 pm - User2: It's yesterday's work"],
 ['15/09/16, 12:22 pm - User1: Gotta work on it, what,hello.']]


regexPattern = re.compile(r"(?P<date>\d{2,}\/\d{2,}\/\d{2,}),\s*(?P<time>\d{2,}:\d{2,}\s*[a-z]{2,})\s*\-\s*(?P<user>\w+)\:\s*(?P<msg>.*)$")
for i in data:
    for j in i:
        print(regexPattern.match(j).groups())

Вывод:

('15/09/16', '12:21 pm', 'User1', 'Hey')
('15/09/16', '12:22 pm', 'User2', '<Media omitted>')
('15/09/16', '12:22 pm', 'User2', "It's yesterday's work")
('15/09/16', '12:22 pm', 'User1', 'Gotta work on it, what,hello.')
2 голосов
/ 21 мая 2019

без RegEx

def parse(item):
    date_time, user_message =  item.split(' - ', 1)
    return [*date_time.split(', '), *user_message.split(': ', 1)]

eggs = [['15/09/16, 12:21 pm - User1: Hey'],
        ['15/09/16, 12:22 pm - User2: <Media omitted>'],
        ["15/09/16, 12:22 pm - User2: It's yesterday's work"],
        ['15/09/16, 12:22 pm - User1: Gotta work on it.']]

spam = [parse(egg[0]) for egg in eggs]
print(spam)

вывод

[['15/09/16', '12:21 pm', 'User1', 'Hey'],
 ['15/09/16', '12:22 pm', 'User2', '<Media omitted>'],
 ['15/09/16', '12:22 pm', 'User2', "It's yesterday's work"],
 ['15/09/16', '12:22 pm', 'User1', 'Gotta work on it.']]
  • форматирование вывода для меня для ясности
  • вам нужно явно указать maxsplit, чтобы быть1
1 голос
/ 21 мая 2019

Это идеальный случай для использования групп регулярных выражений.

s = '15/09/16, 12:21 pm - User1: Hey'
ms = re.match(r'(\d+/\d+/\d+).+?(\d+:\d+).+-\s(.*):\s(.*)', s)

print(ms.groups()) # ('15/09/16', '12:21', 'User1', 'Hey')

Вы можете присоединиться к ним в строку CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...