Найдите несколько шаблонов с помощью 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
Вернуться на верх