根据 RFC,使用 Python 解析从 IRC 服务器接收到的消息的最佳方法是什么?我只是想要某种列表/任何东西,例如:

: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/浏览器/中继/捻/字/协议/ 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!']) 

此功能紧随在IRC RFC中描述的EBNF。

其他提示

您可以用一个简单的列表理解这样做,如果该格式永远是这样。

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

如果你想保持一个低级别的黑客我第二次被未知的扭曲的答案,但首先我想你应该在最近公布的 Yardbird 这是对扭曲的顶部上的很好的请求解析层。它可以让你使用类似Django的URL调度的东西用于处理具有Django的ORM可用于产生反应等的附带好处IRC消息。

我知道这不是Python,但是对于解决这个问题的基于正则表达式的方法,你可以看看 POE::过滤器::IRCD, ,它处理 IRC 服务器协议(请参阅 POE::过滤器::IRC::兼容 对于客户端协议添加)Perl 的解析 POE::组件::IRC 框架。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top