如何匹配精确字符串和通配符字符串

How to match exact strings and wildcard strings

比如说我有这个:

import discord, asyncio, time

client = discord.Client()

@client.event
async def on_message(message):
    if message.content.lower().startswith("!test"):
        await client.send_message(message.channel,'test')

client.run('clienttokenhere')

我想做能够做的两件事:

1) 当且仅当用户输入 exactly !test 时,它会打印出 test频道

2) 如果用户先输入 !test 然后输入 space </code> 和至少一个其他字符串字符,它将打印出 <code>test —— 例如:a) !test 不会打印出任何东西,b) !test </code> (<code>!test 随后通过单个 space) 不会打印出任何东西,c) !test1 不会打印出任何东西,d) !testabc 不会打印出任何东西,但是 e) !test 1 会print out test, f) !test 123abc 会打印出 test, g) !test a 会打印出 test, h) !test ?!abc123 会打印出出test,等等

我只知道 startswithendswith,据我的研究表明,没有 exact 这样的东西,我不确定如何做到这一点startswith

后需要最少字符数

使用 == 运算符。

1) 当接收到的字符串

中只有!test时打印测试
if message.content.lower() == '!test':
    await client.send_message(message.channel,'test')

2) 当后面跟着字符串

时打印test后跟字符串
# If it starts with !test and a space, and the length of a list
# separated by a space containing only non-empty strings is larger than 1,
# print the string without the first word (which is !test)

if message.content.lower().startswith("!test ") 
   and len([x for x in message.content.lower().split(' ') if x]) > 1:
    await client.send_message(message.channel, 'test ' + ' '.join(message.content.split(' ')[1:]))

看起来您需要一个正则表达式而不是 startswith()。而且您似乎有两个相互矛盾的要求:

1) 当且仅当用户完全输入 !test 而没有其他内容时,它将在频道

中打印出 test

2a) !test 不会打印任何东西

包括1,不包括2a:

import re
test_re = re.compile(r"!test( \S+)?$")
# This says: look for
# !test (optionally followed by one space followed by one or more nonspace chars) followed by EOL
# 

@client.event
async def on_message(message):
    if test_re.match(message.content.lower()):
        await client.send_message(message.channel,'test')

包含2a不包含1,替换为这一行(space和!test之后的东西不再是可选的):

test_re = re.compile(r"!test \S+$")