Regex с несколькими квадратными скобками - PullRequest
0 голосов
/ 16 февраля 2020

Я работаю с некоторыми транскрипциями, и я боролся с их нормализацией. Некоторые из них имеют квадратные скобки в других квадратных скобках для указания различных шумов / звуковых событий, которые могут быть обнаружены при прослушивании соответствующего аудиофайла. Это пример строки одного файла:

U012_W038 [other_speech_adult: [laughter] yeah you can you can read [undefined] tomorrow] [other_speech_adult: are you recording me now] this is annoying eh [noise] [noise_bkgspeech/]

В каждой строке формат соответствует

<audio file reference> <transcription>

Мой идеальный вывод будет:

  1. Получить текст, который не заключен в квадратные скобки: например: «это раздражает, эх»
  2. Извлекать текст, заключенный в квадратные скобки, только если найден «:». Текст, который нужно поймать, будет после двоеточия. Например: да, вы можете прочитать

Вывод должен выглядеть примерно так:

U012_W038 yeah you can you can read tomorrow are you recording me now this is annoying eh

Я пытался решить эту проблему с помощью sed, но я бы не стал возражать попробуйте perl или любой другой инструмент для обработки текста. Моя ближайшая попытка на данный момент:

sed 's/\[[^]]*]//g'

Как вы думаете, есть ли способ решить эту проблему с помощью кодирования или ручного контроля?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 16 февраля 2020

Исходя из вашего примера, что-то вроде

perl -pe 's/\[[a-z_]+:|\[[a-z_\/]+\]|\]//g' file

Это можно легко выразить и в sed, но вариации регулярного выражения различаются в разных диалектах. Если у вас есть sed -E или sed -r, вы, вероятно, можете использовать это дословное выражение.

1 голос
/ 16 февраля 2020

Эта версия

perl -pe 's/\[[^]:]+\]//g;s/\[[^]:]*:([^]:]+)*\]/\1/g;s/ +/ /g' file

обнаруживает непарные скобки.

0 голосов
/ 16 февраля 2020

Вы можете использовать эту команду, если ваш файл называется audio:

sed 's/\[\([^]]*:\)//g; s/\[[^]]*]//g; s/]//g; s/  */ /g' audio                           

Это дало мне на вашем примере:

U012_W038 yeah you can you can read tomorrow are you recording me now this is annoying eh

Шаг за шагом шаг, который выполняет эта команда:

  • sed 's/\[\([^]]*:\)//g': удаляет все в диапазоне от [ до : включается

  • sed 's/\[[^]]*]//g': удаляет все между [ и ] включены.

  • sed 's/]//g': удаляет оставшиеся ]

  • sed 's/ */ /g': удаляет все последовательные пропуски.

...