Как заменить символы подчеркивания в файле .ttl только для объектов

У меня есть файл, содержащий тройки RDF (субъект-предикат-объект) в синтаксисе черепахи (файл .ttl), в котором я должен заменить каждое _ пробелом, но только для тройных объектов (субъекты и предикаты должны оставаться прежними). Пример следующий (в моем случае каждый объект заключен в двойные кавычки"):

<http://dbpedia.org/resource/Animalia_(book)> <http://dbpedia.org/property/author> "Graeme_Base" .
<http://dbpedia.org/resource/Animalia_(book)> <http://dbpedia.org/property/illustrator> "Graeme_Base" .

Я хотел бы получить:

<http://dbpedia.org/resource/Animalia_(book)> <http://dbpedia.org/property/author> "Graeme Base" .
<http://dbpedia.org/resource/Animalia_(book)> <http://dbpedia.org/property/illustrator> "Graeme Base" .

Каков самый простой и быстрый способ добиться этого? Файлы очень большие, поэтому я не могу заменять символы подчеркивания по одному. Я пробовал использовать регулярные выражения в Notepad++, но не понимаю, как исключить тему и предикат.

Большое спасибо за помощь


person Furabio JZ4    schedule 12.04.2019    source источник


Ответы (1)


Вы можете использовать:

(?:^<[^\n<>]+>\h+<[^<>\n]+>\h+"|\G(?!^))[^_\n]+\K_(?=[^"\n]*")

Пояснение

  • (?: Non capturing group
    • ^ Assert start of the string
    • <[^\n<>]+>\h+<[^<>\n]+>\h+" Сопоставьте 2 раза открывающую-закрывающуюся угловую скобку, за которой следует 1+ горизонтальных пробельных символов, а затем сопоставьте "
    • | Or
    • \G(?!^) Заявить позицию в конце предыдущего матча, а не в начале
  • ) Закрыть незахватывающую группу
  • [^_\n]+\K_ Совпадение 1+ раз без символа подчеркивания или новой строки с использованием класса символов с отрицательным знаком и забыть, что было сопоставлено с использованием \K. Затем сопоставьте подчеркивание.
  • (?=[^"\n]*") Положительный взгляд вперед, чтобы утверждать, что то, что справа, является закрытием "

демонстрация регулярных выражений

В замене используйте пробел.

person The fourth bird    schedule 12.04.2019
comment
Отличные навыки регулярных выражений. Следует иметь в виду, что, хотя это будет хорошо работать, если входные данные являются регулярными, оно неустойчиво к изменениям синтаксиса. Например, <http://dbpedia.org/resource/Animalia_(book)> <http://dbpedia.org/property/author> "Graeme_Base";\n <http://dbpedia.org/property/illustrator> "Graeme_Base" . является допустимым синтаксисом Turtle, с которым это регулярное выражение не работает, и могут быть другие варианты синтаксиса (коллекции, вложенные пустые узлы и т. д.). Альтернативный подход заключается в использовании библиотеки RDF для фактической обработки данных. - person Jeen Broekstra; 17.04.2019