С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805

Неверный результат регулярного выражения при использовании флага re.IGNORECASE

19.05.2024, 19:59. Показов 363. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чуть не завалился на задаче A. К вашему сведению, задача А на чемпионатах по программированию - это элементарная задача, решаемая за 2 минуты (по идее) и основное назначение которой - не парить мозги, а ознакомить участника с системой тестирования. А я парился с задачей 45 минут, кошмар!

А дело было вот в чем.

Задача: дано предложение, требуется удвоить все слова в предложении. Например, если есть слово "все", то в результате должно быть "все-все".

Мое решение:

Python
1
2
3
4
5
6
7
8
def double_word(s):
    return re.sub(
    r'([а-я]+)',
    r'\1-\1',
    s,
    re.IGNORECASE)
 
print(double_word(input()))
На таймере ровно две минуты, я запускаю тесты и начинаю читать задачу B с полной уверенностью, что задача A уже в кармане. И вдруг у меня глаза лезут на лоб от удивления:

Code
1
Wrong answer: expected "Раз-раз, два-два, три-три!", got "Раз-аз, два-два, три!".
Перечитал свой код раз, другой, третий, ничего не понял. Попробовал написать свои собственные тесты, и с ними такая же фигня: первые два слова удваиваются не всегда корректно, а следующие вообще не удваиваются.

Я даже подумал, что, может быть, есть какая-то проблема с кириллицей, а с латиницей уж точно прокатит, пишу тест с латиницей и меняю буквы в регулярке на латинские, но нет:

Code
1
one-one, two-two, three!
Да что же такое, в конце концов, почему три не удваивается?

В общем, больше сорока минут я мучился, гуглил, пробовал разные варианты, пока не принял наконец решение забить на флаг re.IGNORECASE:

Python
1
2
3
4
5
def double_word(s):
    return re.sub(
    r'([А-Яа-я]+)',
    r'\1-\1',
    s)
Это, конечно, ещё не проходит тесты:

Code
1
Wrong answer: expected "Раз-раз, два-два, три-три!", got "Раз-Раз, два-два, три-три!"
...но уже совсем близко, и ещё через пару минут я сдал задачу.

Однако осадок, что называется, остался. Люди, помогите мне выпрямить свои руки и подскажите, как правильно использовать флаг re.IGNORECASE.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2024, 19:59
Ответы с готовыми решениями:

При вычислении выражения выдается неверный результат
Добрый вечер! Пытался разобраться, но, увы, не получилось. У меня есть пару вопросов: 1) Что значит следующая постановка: "Код...

Результат регулярного выражения
Прошу прощения, если это уже было, следующий код: $search="1"; $s="1_1|fieldsep|1_2|fieldsep|1_3"; ...

Передать результат из регулярного выражения в БД mysql
<?php error_reporting(-1); ini_set('display_errors', 1); $file='Вечер черные брови насопил. Чьи-то raz:кони стоят у двора. Не вчера...

3
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
19.05.2024, 20:57
Цитата Сообщение от КулХацкеръ Посмотреть сообщение
как правильно использовать флаг re.IGNORECASE
а причем тут флаг? А хотя... там может быть и есть засада, но это надо внутренности ковырять...
Цитата Сообщение от КулХацкеръ Посмотреть сообщение
требуется удвоить все слова в предложении
можнонадо так:
Python
1
2
def double_word(s):
    return re.sub(r'(?i)(\b[а-я]+\b)',r'\1-\1',s)
2
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
19.05.2024, 21:11
Лучший ответ Сообщение было отмечено КулХацкеръ как решение

Решение

Проблема в том что в re.sub четвертым аргументом является count, поэтому нужно так
Python
1
2
3
4
5
6
def double_word(s):
    return re.sub(
    r'([а-я]+)',
    r'\1-\1',
    s,
    flags=re.IGNORECASE)
3
710 / 356 / 104
Регистрация: 09.02.2018
Сообщений: 805
19.05.2024, 21:48  [ТС]
Спасибо, TimutGin, проблема была именно в этом. Флаг re.IGNORECASE имеет значение 2, что и объясняет то, что обрабатывались только первые два слова.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2024, 21:48
Помогаю со студенческими работами здесь

Занести результат регулярного выражения в массив
Регулрярное выражение разбивает строку на слова $result = preg_split("/+/", "Hello, World!!!"); print_r($result); ...

Как вывести результат работы регулярного выражения?
Приветствую, комрады. Стандартный кусок кода, показывающий работу с регекспом: Sub qwe() Dim str_in As String str_in =...

Выделить жирным шрифтом результат регулярного выражения
Всем доброго дня. Проблема вроде бы как не стоит и выделонного яйца, но я не смог найти решение, подскажите знающие люди...В общем...

Неверный результат вычисления выражения
Дано выражение : arctg (((log a) - 1) / ((tg c + b)^2)) Реализация на ассемблере: .686 .model flat,stdcall option casemap:none ...

При подсчете среднего значения неверный результат при делении на 5.0, но при делении на другие числа результат верный
Уважаемые присутствующие, разбираю программу из книги по Си. Есть такой код: #include <stdio.h> int main( void ) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru