Загрузка...

Как фильтровать символы по типу U+3164 «»?

Тема в разделе Python создана пользователем hellkarm 2 фев 2025. 115 просмотров

  1. hellkarm
    hellkarm Автор темы 2 фев 2025 9 19 ноя 2024
    Для телеграм бота нужно принимать имя-фамилию из тг аккаунта. Когда в них юзают символы как "" или "" (пустые символы, лолз не передал) мой функционал выглядит ужасно.
    Пробовал:

    Код
    async def clean_username(name: str) -> str:
    if not name.strip():
    return "❌ Аноним"

    INVISIBLE_CHARS = {
    '\u3164',
    '\u200B',
    '\u2060',
    '\uFEFF',
    '\u00A0',
    '\u202F',
    '\u205F',
    '\u3000',
    }

    name = ''.join(
    ch for ch in name
    if unicodedata.category(ch)[0] not in ('C', 'Z') and ch not in INVISIBLE_CHARS
    )

    clean_name = re.sub(r'\s+', '', name)

    return clean_name if clean_name else "❌ Аноним"
    это не сработало.
     
    2 фев 2025 Изменено
    1. Кастория
      hellkarm,
      Код
      ```python
      async def clean_username(name: str) -> str:
      if not name.strip():
      return "❌ Аноним"

      INVISIBLE_CHARS = {
      '\u3164',
      '\u200B',
      '\u2060',
      '\uFEFF',
      '\u00A0',
      '\u202F',
      '\u205F',
      '\u3000',
      }

      name = ''.join(
      ch for ch in name
      if unicodedata.category(ch)[0] not in ('C', 'Z') and ch not in INVISIBLE_CHARS
      )

      clean_name = re.sub(r'\s+', '', name)

      return clean_name if clean_name else "❌ Аноним"```
  2. hellkarm
    hellkarm Автор темы 2 фев 2025 9 19 ноя 2024
    Решил проблему, символ HANGUL JUNGSEONG FILLER не был перечислен в INVISIBLE_CHARS
     
  3. braconn1er
    braconn1er 5 фев 2025 22 8 окт 2023
    а что, всякие сердечки, какашки и прочие эмодзи, знаки препинания, доллары-решетки - это допустимо? Может проще разрешать только допустимый набор символов?

    Python
    def is_valid_string(s):
    # Разрешенные символы: латинские буквы и цифры
    allowed_chars = string.ascii_letters + string.digits

    # Проверяем, что все символы строки входят в allowed_chars
    return all(char in allowed_chars for char in s)


    Или если надо с юникодом, то дикпик вот посоветовал:

    Python
    import unicodedata

    def is_valid_string(s):
    # Разрешенные символы: буквы (включая русские), цифры и печатные символы
    allowed_categories = {
    'Lu', # Заглавные буквы
    'Ll', # Строчные буквы
    'Lt', # Заглавные буквы (титульные)
    'Lo', # Другие буквы (например, кириллица)
    'Nd', # Цифры
    'Nl', # Числовые символы (например, римские цифры)
    'No', # Другие числовые символы
    'Pc', # Соединительные пунктуации
    'Pd', # Тире
    'Ps', # Открывающие скобки
    'Pe', # Закрывающие скобки
    'Pi', # Кавычки (начало)
    'Pf', # Кавычки (конец)
    'Po', # Другие пунктуации
    'Sc', # Символы валют
    'Sm', # Математические символы
    'Sk', # Модификаторы символов
    'So', # Другие символы (например, символы валют)
    'Zs', # Пробельные символы
    }

    for char in s:
    # Получаем категорию символа
    category = unicodedata.category(char)
    # Если символ не входит в разрешенные категории, возвращаем False
    if category not in allowed_categories:
    return False
    return True

    # Пример использования
    test_string = "Привет123!#"
    if is_valid_string(test_string):
    print("Строка соответствует требованиям")
    else:
    print("Строка не соответствует требованиям")
     
    5 фев 2025 Изменено
Top
Загрузка...