Регулярное выражение для разделения текстовой строки в R - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть очень длинная строка, как этот пример ниже, и я изо всех сил пытаюсь найти регулярное выражение, чтобы разделить его на части в соответствии с паттерном, например: '1.OAS / AC 'и' 2.OAS / AD '.

Этот фрагмент текста имеет:

1) различное число в начале

2) две заглавные буквы от A до Z

Я пробовал это:

x <- stringr::str_split(have, "([1-9])( OAS / )([A-Z]{2})")

но не работает

Заранее спасибо за любую помощь!

Пример

require(stringr)
have <- "1. OAS / AC 12345/this is a test string to regex, 2. OAS / AD     79856/this is another test string to regex, 3. OAS / AE 87987/this is a new test string to regex. 4. OAS / AZ 78798456/this is one mode test string to regex."
want <- stringr::str_split(have, "([1-9])( OAS / )([A-Z]{2})")

want <- list(
         "1. OAS / AC " = "12345/this is a test string to regex,",
         "2. OAS / AD " = "79856/this is another test string to regex,",
         "3. OAS / AE " = "87987/this is a new test string to regex.",
         "4. OAS / AZ " = "78798456/this is one mode test string to regex."
)

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

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

library(stringr)
have <- "1. OAS / AC 12345/this is a test string to regex, 2. OAS / AD     79856/this is another test string to regex, 3. OAS / AE 87987/this is a new test string to regex. 4. OAS / AZ 78798456/this is one mode test string to regex."
r <- stringr::str_match_all(have, "(\\d+\\. OAS / [A-Z]{2})\\s*(.*?)(?=\\s*\\d+\\. OAS / [A-Z]{2}|\\z)")
res <- r[[1]][,3]
names(res) <- r[[1]][,2]

Результат:

dput(res)
# => structure(c("12345/this is a test string to regex,", "79856/this is another test string to regex,", 
#  "87987/this is a new test string to regex.", "78798456/this is one mode test string to regex."
#  ), .Names = c("1. OAS / AC", "2. OAS / AD", "3. OAS / AE", "4. OAS / AZ"
#  ))

См. regex demo .

Детали шаблона

  • (\d+\. OAS / [A-Z]{2}) - Группа захвата 1:
    • \d+ - 1+ цифр
    • \. - a .
    • OAS / - буквальная OAS / подстрока
    • [A-Z]{2} - две заглавные буквы
  • \s* - 0+ пробелов
  • (.*?) - Группа захвата 2: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • (?=\s*\d+\. OAS / [A-Z]{2}|\z) - положительный прогноз: непосредственно справа от текущего местоположения,должно быть
    • \s*\d+\. OAS / [A-Z]{2} - 0+ пробелов, 1+ цифр, ., пробел, /, пробел, две заглавные буквы
    • | - или
    • \z - конец строки.
0 голосов
/ 12 февраля 2019

То, как вы описали проблему, немного неясно, но если вы хотите просто извлечь до "OAS / AC",

library(qdap)
beg2char(have, " ", 4)#looks for the fourth occurrence of \\s and extracts everything before it.

Для работы вышеуказанной функции предложения должны быть отдельными строками в символе.vector

Если ваша цель - вставить знак "=" между двухбуквенной подстрокой и числом после "OAS",

gsub("([A-Z])\\s*([0-9])","\\1 = \\2",have,perl=T)
0 голосов
/ 12 февраля 2019

Мы могли бы сделать это с положительным взглядом, ища образец числа, за которым следует пероид:

str_split(have, "(?=\\d+\\.)")

[1] ""                                                             "1. OAS / AC 12345/this is a test string to regex, "          
[3] "2. OAS / AD     79856/this is another test string to regex, " "3. OAS / AE 87987/this is a new test string to regex. "      
[5] "4. OAS / AZ 78798456/this is one mode test string to regex."

И мы можем дополнительно очистить его:

str_split(have, "(?=\\d{1,2}\\.)") %>% unlist() %>% .[-1]

[1] "1. OAS / AC 12345/this is a test string to regex, "           "2. OAS / AD     79856/this is another test string to regex, "
[3] "3. OAS / AE 87987/this is a new test string to regex. "       "4. OAS / AZ 78798456/this is one mode test string to regex." 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...