2013-11-27 5 views
2

im чтение файла, и эта строка в файле дает мне проблемы. этоИспользование Re.split для создания словаря из файла

CSE 3380,professional,CSE 2315,note: MATH 3330 can be taken instead 

код я написал, чтобы разделить это с помощью модуля re.split следовать образцу, что эти типы файлов будут следовать за который

class(comma) catagory(comma) prereq class(comma) note(semicolon) 

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

course, catagory, pre, note = re.split(', |, |, |: ', line) 

Я получаю сообщение об ошибке сказав «ValueError: нужно больше, чем 1 значение для распаковки». Я не знаю, почему. Я использовал этот метод в других строках рисунка, но для этого конкретного шаблона у меня возникли проблемы.

+0

можно напечатать re.split ('|, |, |:', линия), чтобы увидеть, что возвращение, а затем сравните то, что вам нужно. – PasteBT

+0

да я его распечатаю, но я получаю эту ошибку –

+0

Этот онлайн-тестер полезен - http://regex101.com/#python – wwii

ответ

2

Просто разделить точкой с запятой, а затем разделить первую часть с помощью запятой:

>>> var = 'CSE 3380,professional,CSE 2315,note: MATH 3330 can be taken instead' 
>>> var = var.split(':') 
>>> var 
['CSE 3380,professional,CSE 2315,note', ' MATH 3330 can be taken instead'] 
>>> var[0] = var[0].split(',') 
>>> var 
[['CSE 3380', 'professional', 'CSE 2315', 'note'], ' MATH 3330 can be taken instead'] 
2
line = "CSE 3380,professional,CSE 2315,note: MATH 3330 can be taken instead" 
parts = re.match('^(.*?), ?(.*?), ?(.*?)(?:, ?note: ?(.*))$', line).groups() 

Тогда parts является кортеж:

('CSE 3380', 'professional', 'CSE 2315', 'MATH 3330 can be taken instead') 

Или, чтобы получить его как проще для использования словаря:

line = "CSE 3380,professional,CSE 2315,note: MATH 3330 can be taken instead" 
parts = re.match('^(?P<class>.*?), ?(?P<catagory>.*?), ?(?P<prereq>.*?)(?:, ?note: ?(?P<note>.*))$', line).groupdict() 

Какие наборы parts к:

{'note': 'MATH 3330 can be taken instead', 'prereq': 'CSE 2315', 'catagory': 'professional', 'class': 'CSE 3380'} 
Смежные вопросы