Найдите несколько шаблонов с помощью regex
Для заданной строки я хотел бы узнать, выявлен ли в ней шаблон. В конечном итоге, я хочу иметь возможность определять команду (/text, /msg и т.д.) и запускать связанную с ней функцию.
string = str("/plot banana 24/02/2021 KinoDerToten")
#In this example, I want to get the /plot tot be returned.
cmd_search = re.findall(r"/plot", "/cmd", "/text", "/msg", string)
print(cmd_search)
#The parameters for re.findall are not working
Ошибка в сообщении:
TypeError: unsupported operand type(s) for &: 'str' and 'int'
Вы можете использовать условие OR со знаком "|" в регулярном выражении следующим образом.
import re
string = "/plot banana 24/02/2021 KinoDerToten"
cmd_search = re.findall(r"/(plot|cmd|text|msg)", string)
for s in cmd_search:
print("match:", s)
Выход:
match: plot
Если термин может появиться только один раз, то можно использовать "search()" и остановиться, когда один из терминов будет найден в целевой строке.
if m := re.search(r"/(plot|cmd|text|msg)", string):
print("match =", m.group())
Выход:
match = /plot
Если вы используете последнюю версию Python, вы можете использовать match
для решения вашей проблемы в качестве альтернативы:
(ссылка: https://docs.python.org/3/whatsnew/3.10.html#pep-634-structural-pattern-matching)
def plot(args):
print(args)
def msg(txt):
print(f'send "{txt}" to somewhere')
def do(x):
match x.split(maxsplit=1):
case ["/plot", arg]: plot(arg)
case ["/msg", arg]: msg(arg)
do("/plot banana 24/02/2021 KinoDerToten")
# prints banana 24/02/2021 KinoDerToten
do("/msg usera hello test")
# send "usera hello test" to somewhere
или (немного) более сложное соответствие:
def plot(args):
print(args)
def msg(to, txt):
print(f'send "{txt}" to {to}')
def do(x):
match x.split():
case ["/plot", *args]: plot(args)
case ["/msg", to, *txt]: msg(to, ' '.join(txt))
do("/plot banana 24/02/2021 KinoDerToten")
# prints ['banana', '24/02/2021', 'KinoDerToten']
do("/msg usera hello test")
# prints send "hello test" to usera