Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

10 Май 2021, 10:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как использовать regex flag "w" ("u" in Python) ?  (Прочитано 284 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 545



« Стартовое сообщение: 27 Февраль 2021, 10:58 »

Как-то тут я исследовал тему regex... Работа была продолжена.
Работает всё-всё-всё, как ни странно! Включая и этот набор флагов:  ismx, но кроме w, который тоже присутствует в спецификации.

Осталось невыясненным использование этого флага "w". Вопрос носит чисто теоретический характер.
Вне зависимости от смены локали (ru_Ru, en_US) не получается распознавать "слова" с апострофом, числа с десятичным разделителем (точкой или запятой). А должно?
Для задания флага, если при использовании функции REGEX(), можно просто добавить флаг прямо в выражение: (?w)
Например, для поиска слова с учётом юникода: "(?w)\w+"   или   "(?w:\w+)"

Не могли бы привести примеры, где и когда это может быть полезно, и как это работает? У меня не ищет, и не работает...


Спецификация здесь, в разделе "Flag Options".

w   UREGEX_UWORD  're.U (re.UNICODE) in Python

Controls the behavior of \b in a pattern. If set, word boundaries are found according to the definitions of word found in Unicode UAX 29, Text Boundaries. By default, word boundaries are identified by means of a simple classification of characters as either “word” or “non-word”, which approximates traditional regular expression behavior. The results obtained with the two options can be quite different in runs of spaces and other non-word characters.
Перевод:
Управляет поведением \b в шаблоне. Если установлено, границы слова обнаруживаются в соответствии с определениями слова, найденными в Unicode UAX 29, Границы текста. По умолчанию границы слов идентифицируются посредством простой классификации символов как «слово» или «не-слово», что приблизительно соответствует поведению традиционного регулярного выражения. Результаты, полученные с двумя вариантами, могут сильно отличаться в случае пробелов и других символов, не являющихся словами.

Сменить локаль, если в коде...
Код:
    Dim oLocale As New com.sun.star.lang.Locale
'   oLocale.Language = "ru": oLocale.Country = "RU"  'by default
    oLocale.Language = "en": oLocale.Country = "US"

    oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
    oOptions = CreateUnoStruct("com.sun.star.util.SearchOptions")
    oOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
    oOptions.Locale = oLocale

Upd1:
Но некоторые комбинированные символы обрабатываются абсолютно правильно и без флага "w".
Вот, к примеру, гла́сные бу́квы с ударе́ниями:
=REGEX("А́ Е́ И́ О́ У́ Ы́ Э́ Ю́ Я́ а́ е́ и́ о́ у́ ы́ э́ ю́ я́";"\b\w+\b";;2)  'вернёт Е́ (с ударением, позиция в списке: 2)
А отключение флага на результат поиска не влияет: "(?-w)\b\w+\b"
Что странно, однако. Возможно, я что-то путаю...

Upd2:
В VBA библиотека VBScript.RegExp предлагает куда более скромные возможности. Когда я её в последний раз использовал, ничего "русского" в плане границ вообще не работало. То есть в локальной среде вместо простого "\w+" надо было использовать "[а-яА-ЯёЁa-zA-Z0-9]+". Почувствуйте разницу!

Upd3:
Пример:
The quick ("brown") fox can’t jump 32.3 feet in-the-air, right?
The| |quick| |(||"|brown|"|)| |fox| |can’t| |jump| |32.3| |feet| |in|-|the|-|air|,| |right|?|
То, что красным, не воспринимает в качестве одного слова ("\b\w+\b"), а должно бы... "in-the-air" -  три отдельных слова. Как правильно?
« Последнее редактирование: 27 Февраль 2021, 23:27 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 545



« Ответ #1: 27 Февраль 2021, 14:29 »

Оффтоп попутно

Синтаксис
REGEX(Text;Expression[;[Replacement][;Flags|Occurrence]])

Flags: Optional. "g" replaces all matches of Expression in Text, not extracted. If there is no match, Text is returned unmodified.

Функция REGEX, на мой взгляд, сконструирована не совсем удачно в плане флага "g" и, вообще, последнего параметра.
При установленном флаге будут заменены все вхождения, если задан параметр замены (Replacement).
Что касается возврата найденного, то если номер вхождения (Occurence) равен нулю, то функция зачем-то возвращает исходную строку (?), а если указан номер вхождения, то вернёт его.

Как обрабатывать ноль, это, конечно, дело вкуса. Но вот почему флаг "g" здесь работает только на замену и не работает на извлечение? Извлекается или первое вхождение, или заданное. Однако, на мой взгляд, при установленном флаге "g" (Global) должные также извлекаться все вхождения (сейчас, если не задан параметр замены, флаг игнорируется). Тогда, если такая функция помещена в ячейку, мы увидели бы первое значение из массива вхождений. Но массив значений можно было бы и объединить в строке через разделитель или поместить в диапазон ячеек, или посчитать и т. д.

Неудачное решение. К тому же, параметр Flags пока обрабатывает только один флаг (при замене). Но ведь их могло бы (и должно) быть больше: "ismwx". И они должны работать не только на замену, но и на извлечение. И извлекать надо любое вхождение. Тогда зачем объединили вместе два разных по смыслу параметра: Flags|Occurrence ? Запятой (точки с запятой) пожалели?
« Последнее редактирование: 27 Февраль 2021, 15:16 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 545



« Ответ #2: 28 Февраль 2021, 11:58 »

Опубликовал заявку на улучшения функции. Что я ещё тут могу...
Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!