Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2024, 09:35   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию Буква й которая не й, смешение кириллицы и латиницы

здравствуйте, как найти описанное в переменной:
Код:
txt = """
Найти в тексте любую букву на кириллице + следом идущую любую букву на латинице, например: аa
Найти в тексте любую букву на латинице + следом идущую любую букву на кириллице, например: aа
Найти в тексте непонятную букву, схожую с кириллицей или латиницей, например: й й
"""
спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 06.01.2024, 14:06   #2
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

пытался сделать сам, потерпел неудачу))
Код:
import re
 
txt = """
Найти в тексте любую букву на кириллице + следом идущую любую букву на латинице, например: аa
Найти в тексте любую букву на латинице + следом идущую любую букву на кириллице, например: aа
Найти в тексте непонятную букву, схожую с кириллицей или латиницей, например: й й
"""
 
pattern = re.compile(r'[а-я][a-zA-Z]')
 
result = pattern.findall(txt)
 
if result:
    print('Найденные вхождения:', result)
else:
    print('Вхождений не найдено.')
вывод должен быть
Найденные вхождения: ['аa', 'aа', 'й']
Ципихович Эндрю вне форума Ответить с цитированием
Старый 06.01.2024, 14:58   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

переделал код:
Код:
import re
import unicodedata

# Диапазоны кодов для кириллицы
cyrillic_start = 192
cyrillic_end = 255

# Диапазоны кодов для латиницы
latin_start = 65
latin_end = 90

def is_cyrillic(char):
    return cyrillic_start <= ord(char) <= cyrillic_end

def is_latin(char):
    return latin_start <= ord(char) <= latin_end

def find_latin_cyrillic_pair(txt):
    pattern = re.compile(r"[а-я]+[a-z]+")
    matches = pattern.finditer(txt)
    return set(m.group() for m in matches)

def find_cyrillic_latin_pair(txt):
    pattern = re.compile(r"[a-z]+[а-я]+")
    matches = pattern.finditer(txt)
    return set(m.group() for m in matches)

txt = """Найти в тексте любую букву на кириллице + следом идущую любую букву на латинице, например: аa
    Найти в тексте любую букву на латинице + следом идущую любую букву на кириллице, например: aа
    Найти в тексте непонятную букву, схожую с кириллицей или латиницей, например: й й"""

print(f"latin_cyrillic: {find_latin_cyrillic_pair(txt)}")
print(f"cyrillic_latin: {find_cyrillic_latin_pair(txt)}")
длинноватый получился, покороче нельзя? и ещё не понял как искать знак й, который не является буквой й?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 06.01.2024, 16:09   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
как искать знак й, который не является буквой й?
вот этот:
Код:
print(len('й')) # здесь и с диакритическим знаком len = 2
и ему подобные
Ципихович Эндрю вне форума Ответить с цитированием
Старый 06.01.2024, 18:35   #5
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

вот код и как говорится, аппетит приходит во время еды)):
Код:
import re
x = """Найти в тексте любую букву на кириллице + следом идущую любую букву на латинице, например: аa
    Найти в тексте любую букву на латинице + следом идущую любую букву на кириллице, например: aа
    Найти в тексте непонятную букву, схожую с кириллицей или латиницей, например:
    й - это буква и с диакритическим знаком"""
lst_k_d = re.findall(r'[а-яёА-ЯЁ][\u0300-\u036f]+', x)
if lst_k_d: print(f'Список букв схожих с буквами на кириллице и следующим за ними диакритическим знаком (например-й): {lst_k_d}')
print('Список букв на кириллице + следом идущая любая буква на латинице:')
print() # может кто-либо поправить, чтобы был короткий код для поиска в отличие от моего в посте № 3 
print('Список букв на латинице + следом идущая любая буква на кириллице:')
print() # может кто-либо поправить, чтобы был короткий код для поиска в отличие от моего в посте № 3
Ципихович Эндрю вне форума Ответить с цитированием
Старый 11.01.2024, 07:36   #6
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Код:
lst_k_d = re.findall(r'[а-яёА-ЯЁ][\u0300-\u036f]+', text)
if lst_k_d: print('Список букв схожих с буквами на кириллице и следующим за ними диакритическим знаком (например-й): ' + str(list(set(lst_k_d))))
скрипт выдал сообщение
Список букв схожих с буквами на кириллице и следующим за ними диакритическим знаком (например-й): ['\x9690', '\x9697', '\x9694', ...................
начал смотреть а их то и нет в документе, почему меня скрипт вводит в заблуждение? и как его поправить?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 11.01.2024, 13:48   #7
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
и ещё не понял как искать знак й, который не является буквой й?
Нужно сделать нормализацию с композицией (NFC). Ее умеет ICU. Вот для примера код на PHP, использующий нормализацию (в данном случае это NFKC — их есть несколько) для генерации ЧПУ страницы с необязательной транслитерацией:
Код:
function slugify($string, $transliterate = 0) {
    $string = transliterator_transliterate('NFKC; [^[:Letter:][:Digit:][:Space:]\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E] Remove; Lower' . ($transliterate ? '; Any-Latin; Latin-ASCII' : ''), $string);
    return trim(preg_replace('/[-\s\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]+/', '-', $string), '-');
}
Vapaamies на форуме Ответить с цитированием
Старый 11.01.2024, 13:53   #8
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
код на PHP
к сожалению мне не подходит))
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.01.2024, 20:17   #9
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Гуглить тоже мне пришлось: unicodedata — Unicode Database.
Цитата:
Код:
unicodedata.normalize(form, unistr)
Return the normal form form for the Unicode string unistr. Valid values for form are ‘NFC’, ‘NFKC’, ‘NFD’, and ‘NFKD’.
У меня показывает длину 1:
Код:
import unicodedata
print(len(unicodedata.normalize('NFC', 'й')))
То есть оказалось, что в Питоне встроенная поддержка нормализации Юникода есть, даже PyICU ставить не надо.
Vapaamies на форуме Ответить с цитированием
Старый 12.01.2024, 20:24   #10
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

вопрос то в том, что мне нужно символ "й", который схож с буквой "й", но нею не является нужно найти, и может кроме этого примера есть ещё засады подобного рода, я и спрашиваю как? спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
1.Описать функцию, которая возвращает количество слов, в которых содержится хотя бы одна заданная буква. sasharom97 Паскаль, Turbo Pascal, PascalABC.NET 2 07.12.2015 10:01
Программа которая проверяет введена заглавная или малая буква abstractionhawk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 21.04.2013 22:50
Функция,которая определяет, встречается ли заданная буква, которая передается в функцию как параметр harvey Помощь студентам 1 31.03.2013 00:15
Определить, сколько символов кириллицы и латиницы присутствует строке.Строка задается с клавиатуры olhapupkin Помощь студентам 0 30.11.2010 20:10
Смешение цвета TrackBar'ами qwerty55 Общие вопросы Delphi 3 22.06.2010 16:10