Регулярное выражение Python не соответствует словам

1

люди!

Много потоков, созданных здесь о regex и unicode, но, к сожалению, это не работает в моем случае.

У меня есть строка:

 STR = "как надоела эта шляпа"

а также

query = "шляпа"

Я строю строку как:

compile = re.compile(u'\\b' + query + u'\\b')

Если я попробую выполнить поиск:

search = compile.search(STR, re.U + re.I)

Он возвращает None. Почему у меня такое поведение регулярного выражения?

Теги:

2 ответа

0
Лучший ответ

Согласно 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)

Демо-версия Python:

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()) # => шляпа
0

Вам нужно передать флаги на фазу компиляции.

STR = u"как надоела эта шляпа"
query = u"шляпа"
compile = re.compile(u'\\b' + query + u'\\b', re.U | re.I)
search = compile.search(STR)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню