Разбор строк, которые содержат различные поля в разных порядках в Python 3.x - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть несколько записей:

records=['Event: Description of some sort of event, sometimes with a: colon 0 Date: 02/05/2008 Time: 9:30 am Location: Room A Result: Description of result 0',
    'Event: Description of event 1 ',
    'Event: Description of some sort of event 2 Date: 06/03/2010 Time: 1:30 pm Location: Room b Result: Description of result 2',
    'Date: 06/03/2010 Time: 2:30 pm  Event: Description of some sort of event 2 Result: Description of result 2 Location: Room b',
    'Date: 06/03/2010 Result: Description of result 3']

Я (в конце концов) хочу включить их в кадр данных панд, но я даже не могу понять, как разобрать их в полезный список или диктовку.то, что я делаю, это:

import re
import pandas as pd
delimeters = ['Event:', 'Date:', 'Time:','Location:', 'Result:']
delimeters = '|'.join(delimeters)
print('without parentheses, I lose my delimeters:')
for record in records:
    print(re.split(delimeters, record))

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

Я видел примеры использования скобок вокруг одного разделителя для сохранения его в списке разделенных строк, но это приводит к странным результатам с составным списком возможных разделителей.Я не понимаю, например, почему при добавлении скобок получается Nones - хотелось бы это понять!

print('With parentheses things get wierd:')
delimeters = ['(Event:)', '(Date:)', '(Time:)','(Location:)', '(Result:)']
delimeters = '|'.join(delimeters)

for record in records:
    print(re.split(delimeters, record))

В идеале, я бы извлек следующую информацию в качестве результата разбора записи:

{'Event': ['Description of some sort of event, sometimes with a: colon'], 
 'Date': ['02/05/2008'], 
 'Time': ['1:30 pm'], 
 'Location': ['Room b'],
 'Result': ['Some description of the result, sometimes with a : colon']} # etc

Это дало бы мне возможность перейти непосредственно к фрейму данных:

pd.DataFrame({'Event': ['Description of some sort of event, sometimes with a: colon'], 
 'Date': ['02/05/2008'], 
 'Time': ['1:30 pm'], 
 'Location': ['Room b'],
 'Result': ['Some description of the result, sometimes with a : colon']} 
)

Любые указатели или помощь на любом этапе очень ценится.

1 Ответ

0 голосов
/ 14 февраля 2019

Вот решение без использования регулярных выражений, хотя оно включает вложенные циклы:

records = ['Event: Description of some sort of event, sometimes with a: colon 0 Date: 02/05/2008 Time: 9:30 am Location: Room A Result: Description of result 0',
    'Event: Description of event 1 ',
    'Event: Description of some sort of event 2 Date: 06/03/2010 Time: 1:30 pm Location: Room b Result: Description of result 2',
    'Date: 06/03/2010 Time: 2:30 pm  Event: Description of some sort of event 2 Result: Description of result 2 Location: Room b',
    'Date: 06/03/2010 Result: Description of result 3']

delims = ('Event:', 'Date:', 'Time:', 'Location:', 'Result:')

parsed = []

# Iterate records
for record in records:
    # An empty dictionary object
    d = {}
    # Split the record into separate words by spaces
    words = record.split(' ')
    # Iterate the words in the record
    for i in range(len(words)):
        # If this word is one of the delimiters
        if words[i] in delims:
            # Set the key to the delimiter (without a colon)
            key = words[i][:-1]
            # Increment the loop counter to skip to the next item
            i += 1
            # Start with a value of an empty list
            val = []
            # While we are inside the array bounds and the word is not a dilimiter
            while i < len(words) and not words[i] in delims:
                # Add this word to the value
                val.append(words[i])
                # Increment the loop counter to skip to the next item
                i += 1
            # Add the key/value pair to the record dictionary
            d[key] = ' '.join(val)
        # Append the record dictionary to the results
    parsed.append(d)


print(repr(parsed))

Идея состоит в том, чтобы разбить каждую запись на список слов и проверить, является ли каждая из них разделителем.это как ключ, если он есть, и добавление слова к значению, если это не так.

Вывод (довольно печатный):

[{'Date': '02/05/2008',
  'Event': 'Description of some sort of event, sometimes with a: colon 0',
  'Location': 'Room A',
  'Result': 'Description of result 0',
  'Time': '9:30 am'},
 {'Event': 'Description of event 1 '},
 {'Date': '06/03/2010',
  'Event': 'Description of some sort of event 2',
  'Location': 'Room b',
  'Result': 'Description of result 2',
  'Time': '1:30 pm'},
 {'Date': '06/03/2010',
  'Event': 'Description of some sort of event 2',
  'Location': 'Room b',
  'Result': 'Description of result 2',
  'Time': '2:30 pm '},
 {'Date': '06/03/2010', 'Result': 'Description of result 3'}]
...