문제
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/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!'])
이 기능은 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 메시지를 일반적으로 구문 분석하고 싶습니까? 그러나 나는 그것에 대한 구현이 있습니다.
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
저수준 해킹을 계속하고 싶다면 두 번째로 알려지지 않은 답변을 두 번째로, 먼저 최근에 발표 된 것을 살펴 봐야한다고 생각합니다. 초년병 이것은 트위스트 위에있는 좋은 요청 구문 분석 레이어입니다. 응답 등을 생성 할 수있는 Django ORM을 사용할 수 있다는 이점이있는 IRC 메시지를 처리하기 위해 Django URL 디스패치와 유사한 것을 사용할 수 있습니다.
나는 그것이 파이썬이 아니라는 것을 알고 있지만,이 문제에 대한 정기적 인 표현식 접근법을 위해서, 당신은 POE :: 필터 :: IRCD, IRC 서버 프로토콜을 처리하는 (참조 poe :: 필터 :: irc :: compat 클라이언트 프로토콜 추가) Perl 's에 대한 구문 분석 poe :: component :: irc 뼈대.