
Я хочу найти строку типа DOI в предложении и извлечь результат в ячейку. Я нашел функцию »regex« в LibreOffice Calc (текущая версия 6.2.4.2), которая говорит мне, что она сделает именно то, что мне нужно.
Пример:
Foo bar doi: 10.1016/j.cmpb.2018.09.006 baar foooo
Мое регулярное выражение на Python выглядит так:
\b(10[.][0-9]{4,}(?:[.][0-9]+)*\/(?:(?![\"&\'<>])\S)+)\b
и оно хорошо подходит мне в скрипте Python (оно точно соответствует номеру DOI без строки »DOI«, что и подразумевается).
Но функция »regex« отвергает это регулярное выражение. В документации упоминаются выражения ICU Regex, где я не могу найти никаких проблем по сравнению с моим регулярным выражением.
Я что-то упустил? Какой »диалект регулярных выражений« применим для LibreOffice?
решение1
В спискеобычные выраженияподдерживается LibreOffice, большинство стандартных выражений поддерживаются, но два из используемых вами элементов отсутствуют:
- использование
?:
для незахватывающей группы; использование
?!
для отрицательного прогноза.1 1 2 | | | v v v \b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&'<>])\S)+)\b
Я не знаю, какой уровень RE это представляет (судя по всему, это BRE с дополнениями), но это означает, что ваше RE не будет соответствовать вашей тестовой строке.
Неясно, какую часть строки составляет число, которое вы пытаетесь выделить, поэтому я не могу предложить, как можно избежать неподдерживаемых элементов, но вот несколько возможностей:
- Если вам нужна числовая строка от
doi:
до/
, то более простого варианта\b10[.][0-9]{4,}(?:[.][0-9]+)*
будет достаточно. - Если вам нужно все, что находится между
doi:
и следующим пробелом, то вы можете использовать\b10[.][0-9]{4,}(?:[.][0-9]+)*[^\s]*
.
(Этот второй случай дает то же самое совпадение, что и ваш RE наРегЭкср.)
Я понимаю, что ваши реальные данные могут содержать больше исключений, которые необходимо отловить, но без полного знания ваших данных и числа, которое вы пытаетесь сопоставить, я не смогу сделать больше.