Разница между флагом WORD
или без него заключается в способе определения границ слова.
В следующем примере:
import regex
t = 'A number: 3.4 :)'
print(regex.search(r'\b3\b', t))
print(regex.search(r'\b3\b', t, flags=regex.WORD))
Первое напечатает совпадение, а второевозвращает None
, почему?Поскольку «граница слова Unicode» содержит набор правил для различения границ слова, в то время как граница слова Python по умолчанию определяет его как любые не-\w
символы (которые по-прежнему являются буквенно-цифровыми Unicode).
В этом примере 3.4
был разделен по границе слова Python по умолчанию, так как присутствовал символ \W
, точка, следовательно, это граница слова.Для границы слова Юникод, правило гласит «Запрещенные разрывы на«. »» Как «3.4», поэтому период не считался границей слова.
См. Все правила границы слова Юникод здесь: https://unicode.org/reports/tr29/#Sentence_Boundary_Rules
Вывод:
Они оба работают с Юникодом или вашим LOCALE
, но флаг WORD
предоставляет дополнительный набор правил для различения границ слов в дополнение к просто пустой строке \W
, поскольку «слово определяется как последовательность символов слова [\w
]».