Как использовать регулярное выражение для списка параметров, но каждый параметр можно использовать только один раз? - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь взять текстовый файл полного собрания сочинений Шекспира и разделить его на каждое произведение. Я уже создал список всех произведений, отформатированных в тексте, и создал регулярное выражение, которое находит любое из названий.

(?:THE SONNETS|ALL’S WELL THAT ENDS WELL)

И так далее, включая все произведения Шекспира, которые есть в текст.

Регулярное выражение работает по назначению - оно извлекает из текста все строки, содержащие один из заголовков. НО есть проблема: в некоторых случаях (особенно Cymbeline и King John) имя главного персонажа в начале их строк в точности совпадает с названием пьесы. Итак, я могу решить эту проблему, используя каждую работу только один раз.

Есть ли способ написать регулярное выражение для поиска заголовков, а затем, когда оно найдет указанный c заголовок, вытащить его возможностей? Или мне придется сделать что-то более сложное, чем регулярное выражение?

Если это поможет, я специально использую R, и я знаю приличную сумму об использовании rebus для создания регулярных выражений.

TL; DR: я хочу, чтобы регулярное выражение находило первое вхождение каждой строки в списке в более крупном текстовом документе. Могу ли я сделать это с одним регулярным выражением, или мне нужно будет сгенерировать несколько регулярных выражений или выполнить итерацию?

Примеры здесь:

Пример текстового файла:

    THE SONNETS
    
    sonnet text
    sonnet text
    
    
    ALL'S WELL THAT ENDS WELL
    
    play text
    
    CHARACTER: line line
    CHARACTER: line line
    
    
    KING JOHN
    
    play text
    
    CHARACTER: line line
    KING JOHN: line line
    CHARACTER: line line
    
    AS YOU LIKE IT
    
    play text
    
    CHARACTER: line line

Что я хотел бы иметь возможность сделать это

library(stringr)
text <- readLines("sample-text.txt") # contains above sample text
split_indices <- stringr::str_which(text, REGEX-THAT-I-NEED)

И тогда text[split_indices] должен возвращать вектор символов, например c("THE SONNETS", "ALL'S WELL THAT ENDS WELL", "KING JOHN", "AS YOU LIKE IT") вместо c("THE SONNETS", "ALL'S WELL THAT ENDS WELL", "KING JOHN", "KING JOHN", "AS YOU LIKE IT"), который вернет мое текущее регулярное выражение.

1 Ответ

1 голос
/ 12 июля 2020

Предполагая, что только заголовки всегда в верхнем регистре и содержат символы c алфавита, апострофы и пробелы, и ничего подобного, этого должно быть достаточно для сопоставления заголовков без каких-либо ложных срабатываний. Убедитесь, что в вашем сопоставлении включен многострочный флаг.

Шаблон

^\s*\b([A-Z\s']+)\b$

Пояснение

  • ^ Начало строки
  • \s* Может содержать ноль или более пробелов перед заголовком
  • \b Граница слова
  • ( Начало группы захвата
    • [A-Z\s'] Соответствие символов AZ, пробела или апострофа
      • + Одно или несколько вхождений указанного выше токена
  • ) Конец группы захвата
  • \b Граница слова
  • $ Конец строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...