Как regex.WORD влияет на поведение \ b? - PullRequest
0 голосов
/ 20 сентября 2018

Я использую модуль PyPI regex для сопоставления регулярных выражений.Он говорит

  • Граница слова по умолчанию в Юникоде

    Флаг WORD изменяет определение «границы слова» на определение границы слова по умолчанию в Юникоде.Это относится к \b и \B.

Но, похоже, ничего не изменилось:

>>> r1 = regex.compile(r".\b.", flags=regex.UNICODE)
>>> r2 = regex.compile(r".\b.", flags=regex.UNICODE | regex.WORD)
>>> r1.findall("русский  ελλανικα")
['й ', ' ε']
>>> r2.findall("русский  ελλανικα")
['й ', ' ε']

Я не заметил никакой разницы...

1 Ответ

0 голосов
/ 20 сентября 2018

Разница между флагом 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]».

...