Как разбить строку и выбрать конкретное поле - PullRequest
0 голосов
/ 27 мая 2018

У меня есть строка, которую мне нужно разделить / нарезать и установить как разные переменные.Вот пример строки:

Uploaded 09-09 2015, Size 2.05 GiB, ULed by USERX

Мне нужно, чтобы конечный результат был примерно таким:

date = '09-09 2015' ; size = '2.05' ; user = 'USERX'

Вот код, который я использую до сих пор, с переменной 'string'представляющий оригинальную строку:

date, size, user = string.split(',')
date = date.split()[1], date.split()[2]
size = size.split()[1]
user = user.split()[2]

Это работает, но я не могу не чувствовать, что код болезненно взломан.Есть лучший способ сделать это?Большое спасибо, пусть ваш код элегантен и без ошибок.

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

Еще один, использующий словарь mapping:

import re

string = "Uploaded 09-09 2015, Size 2.05 GiB, ULed by USERX"
mappings = {'Uploaded': 'date', 'Size': 'size', 'by': 'user'}
rx = re.compile(r'(\w+)\s*\b([-. A-Z0-9]{2,})\b')

result = {mappings[m.group(1)]: m.group(2).strip() 
          for m in rx.finditer(string)}
print(result)

Это дает

{'date': '09-09 2015', 'size': '2.05', 'user': 'USERX'}

См. демонстрацию на regex101.com .

0 голосов
/ 27 мая 2018

Возможно, вы захотите попробовать захват именованной группы в Python:

import re
test_string = 'Uploaded 09-09 2015, Size 2.05 GiB, ULed by USERX'
p = re.compile(r'\w+ (?P<date>\d{2}-\d{2} \d{4}), Size (?P<size>\d+(\.\d+)?) GiB, ULed by (?P<user>\w+)')
result = p.search(test_string)
result.groupdict()
0 голосов
/ 27 мая 2018

Вы можете использовать re.findall:

import re
s = 'Uploaded 09-09 2015, Size 2.05 GiB, ULed by USERX'
results = re.findall('(?<=Uploaded\s)[\d\-\s]+|(?<=Size\s)[\d\.]+|(?<=ULed by\s)\w+$', s)
d = dict(zip(['date', 'size', 'user'], results))

Выход:

{'date': '09-09 2015', 'size': '2.05', 'user': 'USERX'}
...