Извлечение шаблона имен пользователей из сообщений - PullRequest
1 голос
/ 08 марта 2019

Я создал бот Discord py, который позволяет пользователям обмениваться данными между серверами (т. Е. Оба пользователя не обязательно должны быть на одном сервере). Это работает для тех с простыми именами пользователя, такими как littlefox#1234 или little_fox#1234.

Однако, когда имя пользователя более сложно с пробелами, такими как little fox#1234, оно ставится в тупик. Бот принимает такие команды, как !hello, !greet, !bye и т. Д. Я пытался использовать регулярные выражения, но это тоже не работает:

import re
match = re.match(r"!\w( [a-z]*#[0-9]*)", '!hello little fox#1234')
print(match)
other_match = re.match(r"!\w( [a-z]*#[0-9]*)", '!hello little_fox#1234')
print(other_match)

Однако это не соответствует ничему. Оба возвращают None. Что мне делать?

1 Ответ

1 голос
/ 09 марта 2019

Вы можете использовать

(?:!\w+\s+)?([\w\s]*#[0-9]*)

См. Демоверсию regex

Детали

  • (?:!\w+\s+)? - необязательная группа, соответствующая 1 или 0 повторениям
    • ! - ! char
    • \w+ - 1+ слово символов
    • \s+ - 1+ пробелов
  • ([\w\s]*#[0-9]*) - Группа 1: ноль или более слов или пробелов, # и 0+ цифр.

Обратите внимание, что если должна быть хотя бы одна буква и цифра, замените * на +: (?:!\w+\s+)?([\w\s]+#[0-9]+).

См. Демоверсию Python :

import re
rx = r"(?:!\w+\s+)?([\w\s]*#[0-9]*)"
ss = ["!hello little fox#1234", "little fox#1234"]
for s in ss:
    m = re.match(rx, s)
    if m:
        print(m.group(1))  # The username is in Group 1

Для обоих входов выход равен little fox#1234.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...