Python и синтаксический анализ IRC-сообщений
Вопрос
Каков наилучший способ анализа сообщений, полученных с IRC-сервера с помощью Python, в соответствии с RFC?Мне просто нужен какой-то список / что угодно, например:
:test!~test@test.com PRIVMSG #channel :Hi!
становится этим:
{ "sender" : "test!~test@test.com", "target" : "#channel", "message" : "Hi!" }
И так далее?
(Редактировать:Я хочу анализировать IRC-сообщения в Общая информация, не только PRIVMSG)
Решение
Посмотрите на реализацию Twisted http://twistedmatrix.com/
К сожалению, у меня нет времени, может быть, кто-нибудь другой сможет вставить это сюда для вас.
Редактировать
Что ж, я вернулся, и, как ни странно, его еще никто не вставил, так что вот оно:
http://twistedmatrix.com/trac/browser/trunk/twisted/words/protocols/irc.py#54
def parsemsg(s):
"""Breaks a message from an IRC server into its prefix, command, and arguments.
"""
prefix = ''
trailing = []
if not s:
raise IRCBadMessage("Empty line.")
if s[0] == ':':
prefix, s = s[1:].split(' ', 1)
if s.find(' :') != -1:
s, trailing = s.split(' :', 1)
args = s.split()
args.append(trailing)
else:
args = s.split()
command = args.pop(0)
return prefix, command, args
parsemsg(":test!~test@test.com PRIVMSG #channel :Hi!")
# ('test!~test@test.com', 'PRIVMSG', ['#channel', 'Hi!'])
Эта функция полностью соответствует EBNF, описанному в IRC RFC.
Другие советы
Вы можете сделать это с помощью простого понимания списка, если формат всегда такой.
keys = ['sender', 'type', 'target', 'message']
s = ":test!~test@test.com PRIVMSG #channel :Hi!"
dict((key, value.lstrip(':')) for key, value in zip(keys, s.split()))
Результат:
{'message': 'Hi!', 'type': 'PRIVMSG', 'sender': 'test!~test@test.com', 'target': '#channel'}
Вы просто хотите анализировать IRC-сообщения в целом или вы хотите просто анализировать PRIVMSGS?Однако у меня есть реализация для этого.
def parse_message(s):
prefix = ''
trailing = ''
if s.startswith(':'):
prefix, s = s[1:].split(' ', 1)
if ' :' in s:
s, trailing = s.split(' :', 1)
args = s.split()
return prefix, args.pop(0), args, trailing
Если вы хотите придерживаться низкоуровневого взлома, я поддерживаю искаженный ответ Неизвестного, но сначала, я думаю, вам следует взглянуть на совсем недавно анонсированный Ярдберд это хороший слой для анализа запросов поверх Twisted.Это позволяет вам использовать что-то похожее на отправку URL-адресов Django для обработки IRC-сообщений с дополнительным преимуществом наличия Django ORM для генерации ответов и т.д.
Я знаю, что это не Python, но для подхода к этой проблеме, основанного на регулярных выражениях, вы могли бы взглянуть на POE::Фильтр::IRCD, который обрабатывает протокол IRC-сервера (см. POE::Фильтр::IRC::Совместимость для дополнения клиентского протокола) синтаксический анализ для Perl POE::Компонент::IRC рамки.