如何匹配完全字符串和通配符字符串

时间:2017-05-28 13:26:43

标签: python python-3.x wildcard string-matching discord.py

比如说我有这个:

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)设置为当且仅当用户输入完全 !test而没有其他内容时,它将在频道中打印出test

2)如果用户首先键入!test后跟空格和至少一个其他字符串字符,那么它将打印出来test - 所以对于示例:a)!test不打印任何内容,b)!test !test后跟单个空格)不会打印任何内容,c){{1不会打印任何内容,d)!test1不打印任何内容,但e)!testabc将打印出!test 1,f)test将打印出来{{} 1}},g)!test 123abc将打印出test,而h)!test a将打印出test等。

我只知道!test ?!abc123test,就我的研究所说,没有startswith这样的东西,我不知道如何制作它以便它需要endswith

后的最小数字字符

2 个答案:

答案 0 :(得分:0)

使用==运算符。

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:]))

答案 1 :(得分:0)

看起来你需要一个正则表达式而不是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,替换此行(!test之后的空格和内容不再是可选的):

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