люди!
Много потоков, созданных здесь о regex и unicode, но, к сожалению, это не работает в моем случае.
У меня есть строка:
STR = "как надоела эта шляпа"
а также
query = "шляпа"
Я строю строку как:
compile = re.compile(u'\\b' + query + u'\\b')
Если я попробую выполнить поиск:
search = compile.search(STR, re.U + re.I)
Он возвращает None. Почему у меня такое поведение регулярного выражения?
Согласно Python re
docs, Pattern.search(string[, pos[, endpos]])
второй аргумент - это позиция в строке, где должен начинаться поиск.
См. Значения, которые вы суммируете:
>>> print(re.U)
32
>>> print(re.I)
2
>>> print(re.I + re.U)
34
Нет соответствия в вашей строке после индекса 34.
Таким образом, вы можете передать флаги re.I
и re.U
при вызове re.compile
:
re.compile(ur'\b{}\b'.format(query), re.U | re.I)
или использовать их как встроенные модификаторы внутри шаблона
re.compile(ur'(?ui)\b{}\b'.format(query))
или используйте простой re.search
где третий аргумент - это флаги:
re.search(ur'\b{}\b'.format(query), STR, re.I | re.U)
import re
STR = u"как надоела эта шляпа"
query = u"шляпа"
compile = re.compile(ur'\b{}\b'.format(query), re.U | re.I)
search = compile.search(STR)
print(search.group()) # => шляпа
Вам нужно передать флаги на фазу компиляции.
STR = u"как надоела эта шляпа"
query = u"шляпа"
compile = re.compile(u'\\b' + query + u'\\b', re.U | re.I)
search = compile.search(STR)