質問
RFC に従って Python を使用して IRC サーバーから受信したメッセージを解析する最良の方法は何ですか?私は単純に何らかのリスト/何でも欲しいのです。例えば:
:test!~test@test.com PRIVMSG #channel :Hi!
これは次のようになります:
{ "sender" : "test!~test@test.com", "target" : "#channel", "message" : "Hi!" }
等々?
(編集:IRCメッセージを解析したい 一般的な, PRIVMSG だけでなく)
解決
ツイストの実装 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
あなたは私不明により第2のねじれ答えハッキング低レベルに維持したいが、まず私はあなたが非常に最近発表されたの <のhref = "HTTP見とるべきであると思われる場合://ゾークを。ネット/ MOTD /ニック/ジャンゴ/導入-yardbird.html」REL = "nofollowをnoreferrer">ツイストの上に素敵な要求解析層であるYardbird にする。それはあなたが回答などを生成するためのDjangoのORMは、利用可能持つの側の利益とIRCメッセージを処理するために派遣DjangoのURLに似たものを使用することができます。
これが Python ではないことはわかっていますが、この問題に対する正規表現ベースのアプローチについては、以下を参照してください。 POE::フィルター::IRCD, 、IRC サーバー プロトコルを処理します (「 POE::フィルター::IRC::互換 クライアントプロトコルの追加用) Perl の解析 POE::コンポーネント::IRC フレームワーク。