tgoop.com/gitversenews/740
Last Update:
Решение задачки с regex
Друзья, на день программиста мы поделились с вами задачкой про regex. Видели в комментариях ваши варианты решения, спасибо за крутые идеи!
Теперь делимся нашим вариантом, а также показываем, как с этой задачей справился ИИ-ассистент GigaCode
Итак, почему часть упоминаний не ловится?
В исходном коде использовался шаблон r"\b256-?й\b", который ищет «256», за которым следует опциональный ASCII-дефис (-, U+002D) и «й». Но в тексте встречаются разные Unicode-символы: обычный дефис, неразрывный дефис, en dash, em dash и другие. ASCII-дефис (-) не покрывает эти типографские варианты, поэтому часть совпадений теряется.
Решение в одну строчку:
Чтобы поймать все варианты «256-го» дня, нужно заменить -? на диапазон Unicode-символов, включающий все типы дефисов и тире. Вот исправленный код:
import re
text = (
"Сегодня 256-й день! Ура!\n"
"А у дизайнера типографика: 256-й день (NBSP-hyphen), 256–й (en dash), 256й без дефиса.\n"
"Ещё встретилось: 256–й, 256—й и даже 256-й в заголовке."
)
found = re.findall(r"\b256[\-\u2010-\u2015\u2212]?й\b", text, flags=re.IGNORECASE)
print(found) # ['256-й', '256-й', '256–й', '256й', '256—й', '256-й']
Что здесь происходит?
\b256 — граница слова и число «256».
[\-\u2010-\u2015\u2212]? — опциональный символ из диапазона:
\- — ASCII hyphen-minus (U+002D).
\u2010-\u2015 — диапазон Unicode: HYPHEN (U+2010), NON-BREAKING HYPHEN (U+2011), FIGURE DASH (U+2012), EN DASH (U+2013), EM DASH (U+2014), HORIZONTAL BAR (U+2015).
\u2212 — MINUS SIGN (U+2212).
й\b — буква «й» и граница слова.
flags=re.IGNORECASE — игнорируем регистр.
Если у вас есть еще идеи или вопросы по regex, пишите в комментариях — обсудим!

