如何正确匹配 IRC 上的私人消息?
Posted
技术标签:
【中文标题】如何正确匹配 IRC 上的私人消息?【英文标题】:How can I properly match a private message on IRC? 【发布时间】:2016-06-21 17:15:56 【问题描述】:我正在制作一个 irc 库,但我似乎无法仅匹配私人消息,它也匹配版本字符串。
正则表达式
:(?P<from>.*?)!\S+\sPRIVMSG\s(?P<to>.*?)\s:(?P<msg>.+)
版本匹配
VERSION_STRING: :AkaneSenri1!~AkaneSenr@72A6C9FC.264941B0.A6596FAF.IP PRIVMSG AkaneSenri1 :VERSION
MATCHED: AkaneSenri1', u'AkaneSenri1', u'\x01VERSION\x01
PRIVATE_MESSAGE_STRING: :AkaneSenri1!~AkaneSenr@72A6C9FC.264941B0.A6596FAF.IP PRIVMSG AkaneSenri1 :T
MATCHED: (u'AkaneSenri1', u'AkaneSenri1', u'T') # is what I want
我得到的是服务器在您连接时发送的版本字符串。 我需要的是,当用户向机器人发送 PM 时。 (昵称/味精)
【问题讨论】:
你能告诉我们你得到了什么以及你期望什么? 可能是:(?P<from>.*?)!\S+\sPRIVMSG\s(?P<to>.*?) :(?!VERSION$)(?P<msg>.+)
? (注意我使用re.M
修饰符$
来匹配行尾,而不是字符串)
它似乎仍然与版本字符串匹配
您必须使用“m”(多行匹配)- Wiktor 的正则表达式似乎适合您的输入。
:(?P<from>.*?)!\S+\sPRIVMSG\s(?P<to>.*?) :(?!VERSION)(?P<msg>.+)
? 请定义一个版本字符串。
【参考方案1】:
:(?P<from>.*?)!\S+\sPRIVMSG\s(?P<to>.*?)\s+:(?!VERSION)(?P<msg>.*)$
它正在寻找 : not followed by VERSION
并带有负前瞻 (?!...)
在此处查看:https://regex101.com/r/sQ7eS6/2(单击左侧的单元测试位,然后运行两个测试。或者将您的行粘贴到主要位)
【讨论】:
pastebin.com/raw/sb5SqVxJ 只需注释掉import errors
和所有的 raise 语句,它就会运行。它仍然是版本。
@MichaelBorgfield 您不能粘贴导致问题的示例字符串,但您可以与全世界分享您的用户名和密码?嗯。
我发布了服务器发送的确切消息,我还提供了完整的库,以便您查看。您想要完整的日志吗?
我不知道为什么这不起作用,我确实使用了一个类似于您使用的网站。我得到了一个肯定的匹配,但无论出于何种原因,它在应用到 lib 时似乎都不起作用。以上是关于如何正确匹配 IRC 上的私人消息?的主要内容,如果未能解决你的问题,请参考以下文章
在网站上为公共和私人聊天选择哪个更好:IRC 或 Jabber?