В OpenRefine, как найти / заменить инициалы на регулярное выражение? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть список имен с инициалами, которые я хочу изменить, например, «Браун, Джон || Смит, Дж. С.» на «Браун, Джон || Смит, Дж. С.»

Я думаю, что способ сделать это в OpenRefine - отредактировать ячейки / заменить. Затем в «Заменить» с помощью регулярного выражения:

Поиск: (\,\s[A-Z]\s[A-Z]\s)

Заменить на: (\,\s[A-Z]\.\s[A-Z]\.\s)

Но это приводит к: «Браун, Джон || Смит (, s [A-Z] .s [A-Z] .s)»

Чего не хватает? Любые советы будут высоко оценены.

1 Ответ

0 голосов
/ 24 апреля 2019

Когда вам нужно использовать часть выражения «найденный» в замене, как здесь, вам нужно использовать «группы захвата» для захвата значений из выражения «найти», а затем использовать их в замене - так что я думаю, что вам нужно:

Найти: \,\s([A-Z])\s([A-Z])\s Заменить: , $1. $2

Обратите внимание, что вам не нужно использовать специальные символы или экранировать выражение замены.

Однако опасность здесь заключается в том, что это очень специфично для поиска двух инициалов - он потерпит неудачу для одного инициала и приведет к неполной замене с тремя или более инициалами.

Вы могли бы написать более сложное регулярное выражение для работы с разным количеством инициалов, но я бы порекомендовал использовать для этого работу преобразование OpenRefine. Если вы сделали что-то вроде

Редактировать ячейки -> Преобразовать

затем используйте GREL

forEach(value.split(" "),v,if(v.length()==1,v+".",v)).join(" ")

, который будет иметь дело с любым количеством инициалов. Это делит начальную строку на каждый пробел, а затем, если длина найденного «слова» равна 1 (то есть одиночный символ), он добавляет точку / точку после нее. Затем объедините все «слова» обратно в строку. Это можно улучшить, проверив, что «слово» - это одна заглавная буква, а не просто длина == 1, но это иллюстрирует основной подход.

...