如何匹配精确字符串和通配符字符串
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
,等等
我只知道 startswith
和 endswith
,据我的研究表明,没有 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+$")
比如说我有这个:
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
,等等
我只知道 startswith
和 endswith
,据我的研究表明,没有 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+$")