используя python для разбора двоеточия (:) разделили строку на объект

У меня есть строка, которая является возвращаемым значением REST API ( http://requesttracker.wikia.com/wiki/REST ) и использует парные пары ключ / значение с двоеточием.

id: 123414 name: Peter message: bla bla bla bla 

Как я могу разобрать эту строку для объекта? есть ли существующий анализатор python, который я могу использовать?

Вот строка, которую я хочу проанализировать:

 'RT/3.8.8 200 Ok\n\nid: ticket/46863\nQueue: customer-test\nOwner: Nobody\nCreator: young.park\nSubject: testing\nStatus: new\nPriority: 0\nInitialPriority: 0\nFinalPriority: 0\nRequestors: superuser@meme.com\nCc:\nAdminCc:\nCreated: Mon Apr 25 15:50:27 2011\nStarts: Not set\nStarted: Not set\nDue: Not set\nResolved: Not set\nTold: Not set\nLastUpdated: Mon Apr 25 15:50:28 2011\nTimeEstimated: 0\nTimeWorked: 0\nTimeLeft: 0\nCF.{Severity}: \n\n' 

4 Solutions collect form web for “используя python для разбора двоеточия (:) разделили строку на объект”

Вам действительно нужно сказать, какой REST api и предоставить ссылку на документацию.

Поверхностно это выглядит не слишком тяжело:

 # Look Ma, no imports! >>> s = 'id: 1234\nname: Peter\nmessage: foo bar zot\nmsg2: tee:hee\n' >>> dict(map(str.strip, line.split(':', 1)) for line in s.splitlines()) {'message': 'foo bar zot', 'msg2': 'tee:hee', 'id': '1234', 'name': 'Peter'} 

Но: (1) документация должна указывать на парсер (2), ничто не так просто, как кажется из одного простого примера (см. tee:hee above); если вы решите перевернуть свой собственный, вы должны разбить вышеуказанный однострочный вкладыш на несколько шагов, чтобы вы могли выполнить некоторую проверку ошибок (например, line.split () возвращает ровно 2 части).

Обновление после ссылки api было дано:

На первый взгляд, веб-сайт дает огромное количество примеров без фактического указания того, что такое формат. Я предлагаю вам дать вам больше, чем взглянуть; если это не удается, обратитесь к автору / сопровождающему.

Обновление 2 после ввода фактического примера ввода и после комментария «Я просто попробовал это и потерпел крах»:

Предоставленный код был в ответ на первый (неоднозначный) пример ввода, в котором все строки, кроме последнего, содержали двоеточие. Это сопровождалось предложением о том, что это должно делаться на куски, а не в однострочном лайнере с особым упором на проверку результата split(':', 1) . Какой код вы использовали? Что означает «потерпевший крах»? Вы пытались решить для себя, какова была ваша проблема, и исправить ее?

Какие данные вы его кормили? Ваш долгожданный фактический образец имеет разделенный двоеточием ключ: строки значений, которым предшествует строка курса и пустая строка, а затем пустая строка. Они могут быть блаженно проигнорированы путем тривиальной настройки на однострочный:

 >>> print dict(map(str.strip, line.split(':', 1)) for line in s.splitlines()[2:-1]) {'Status': 'new', 'Resolved': 'Not set', 'CF.{Severity}': '', 'TimeLeft': '0', 'Creator': 'young.park', 'Cc': '', 'Starts': 'Not set', 'Created': 'Mon Apr 25 15:50:27 2011', 'Due': 'Not set', 'LastUpdated': 'Mon Apr 25 15:50:28 2011', 'Started': 'Not set', 'Priority': '0', 'Requestors': 'superuser@meme.com', 'AdminCc': '', 'Owner': 'Nobody', 'Told': 'Not set', 'TimeEstimated': '0', 'InitialPriority': '0', 'FinalPriority': '0', 'TimeWorked': '0', 'Subject': 'testing'} >>> 

Примечание 1: вывод выше, отредактированный вручную, чтобы избежать горизонтальной прокрутки.

Примечание 2: Включает созданные и LastUpdated записи (-: чьи значения содержат двоеточия 🙂

Если вы не верите в блаженное игнорирование вещей, вы можете сначала сделать разделенные линии и утверждать, что первая строка содержит что-то вроде ожидаемого заголовка, а вторая и последняя строки пустые.

Это похоже на YAML. Вы пробовали PyYAML ?

 >>> import yaml >>> s = """id: 123414 ... name: Peter ... message: bla bla ... bla bla""" >>> yaml.load(s) {'message': 'bla bla bla bla', 'id': 123414, 'name': 'Peter'} 

Примеры выглядят как настроенные http-сообщения (но это не так, это было бы слишком просто); вы можете использовать rfc822.Message для их анализа:

 import rfc822 from cStringIO import StringIO # skip status line; read headers m = rfc822.Message(StringIO(raw_text[raw_text.index('\n\n')+2:])) 

Теперь у вас есть доступ к отдельным заголовкам:

 >>> m.getheader('queue') 'customer-test' >>> m.getrawheader('queue') ' customer-test\n' >>> m.getheader('created') 'Mon Apr 25 15:50:27 2011' >>> m.getdate('created') (2011, 4, 25, 15, 50, 27, 0, 1, 0) 

Все заголовки:

 >>> from pprint import pprint >>> pprint(dict(m.items())) {'admincc': '', 'cc': '', 'cf.{severity}': '', 'created': 'Mon Apr 25 15:50:27 2011', 'creator': 'young.park', 'due': 'Not set', 'finalpriority': '0', 'id': 'ticket/46863', 'initialpriority': '0', 'lastupdated': 'Mon Apr 25 15:50:28 2011', 'owner': 'Nobody', 'priority': '0', 'queue': 'customer-test', 'requestors': 'superuser@meme.com', 'resolved': 'Not set', 'started': 'Not set', 'starts': 'Not set', 'status': 'new', 'subject': 'testing', 'timeestimated': '0', 'timeleft': '0', 'timeworked': '0', 'told': 'Not set'} 

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

Конечно, есть способ получить то, что вы хотите с помощью методов string, у меня есть идея об этом, но я предпочитаю обращаться непосредственно к инструменту регулярных выражений, считая, что сложность состоит в том, чтобы поймать вторую часть после того, как двоеточие имеет в ней символы новой строки

 import re regx = re.compile ('(^[^:]+):((?:[^:]+\r?\n)*[^:]+)$',re.MULTILINE) coloned = '''id: 123414 name: Peter message: bla bla bla bla the end: of the text''' print regx.findall(coloned) 

дает

 [('id', ' 123414'), ('name', ' Peter'), ('message', ' bla bla\nbla bla'), ('the end', ' of the text')] 

,

РЕДАКТИРОВАТЬ

Таким образом, в этой «проблеме» не было никаких трудностей,

 import re regx = re.compile ('^([^:\n]+): *(.*?) *$',re.MULTILINE) ch = ('RT/3.8.8 200 Ok\n' '\n' 'id: ticket/46863\n' 'Queue: customer-test\n' 'Owner: Nobo:dy\n' 'Creator: young.park\n' 'Subject: testing\n' 'Status: new\n' 'Priority: 0\n' 'InitialPriority: 0\n' 'FinalPriority: 0\n' 'Requestors: superuser@meme.com\n' 'Cc:\nAdminCc:\n' 'Created: Mon Apr 25 15:50:27 2011\n' 'Starts: Not set\n' 'Started: Not set\n' 'Due: Not set\n' 'Resolved: Not set\n' 'Told: Not set\n' 'LastUpdated: Mon Apr 25 15:50:28 2011\n' 'TimeEstimated: 0\n' 'TimeWorked: 0\n' 'TimeLeft: 0\n' 'CF.{Severity}: \n' '\n') print dict(regx.findall(ch)) print s = 'id: 1234\nname: Peter\nmessage: foo bar zot\nmsg2: tee:hee\n' print dict(regx.findall(s)) 

результат

 {'Due': 'Not set', 'Priority': '0', 'id': 'ticket/46863', 'Told': 'Not set', 'Status': 'new', 'Started': 'Not set', 'Requestors': 'superuser@meme.com', 'FinalPriority': '0', 'Resolved': 'Not set', 'Created': 'Mon Apr 25 15:50:27 2011', 'AdminCc': '', 'Starts': 'Not set', 'Queue': 'customer-test', 'TimeWorked': '0', 'TimeLeft': '0', 'Creator': 'young.park', 'Cc': '', 'LastUpdated': 'Mon Apr 25 15:50:28 2011', 'CF.{Severity}': '', 'Owner': 'Nobo:dy', 'TimeEstimated': '0', 'InitialPriority': '0', 'Subject': 'testing'} {'message': 'foo bar zot', 'msg2': 'tee:hee', 'id': '1234', 'name': 'Peter'} 

,

Джон Мачин, я не обманывал это новое регулярное выражение, мне потребовалось одну минуту, чтобы переписать его, и это не заняло бы гораздо больше времени, если бы нам не пришлось просить основную основную информацию, необходимую для ответа

Три замечания:

  • если входные данные когда-либо меняются, а дополнительная пустая строка появляется где-нибудь среди других, ваше решение будет аварийно, а мое регулярное решение будет продолжать работать хорошо. Ваше решение должно быть завершено, if ':' in line

  • Я сравнивал время выполнения:

    мое regex sol 0,000152533352703 секунды, ваш 0.000225727012791 (+ 48%)

С if ':' in line добавлено, оно немного длиннее: 0.000246958761519 секунд (+ 62%)

Скорость здесь не важна, но в других приложениях хорошо знать, что регулярные выражения очень быстрые (в 100 раз быстрее, чем lxml и 1000 быстрее, чем BeautifulSoup)

  • вы являетесь специалистом формата CSV. Также возможно решение с функциями модуля StringIO и csv
  • Использование forever.js с Python
  • «Объекты серии изменяются и не могут быть хешированы»
  • Разделите буквы разницей двух строк
  • Поиск элементов в кортеже и их фильтрация
  • Python - Как сделать кроссворд быстрее
  • как импортировать только методы класса в python
  • JustHost.com и Python CGI
  • Как объединить тестовые конечные точки Google Cloud
  • Python - лучший язык программирования в мире.