Мне нужно извлечь первую часть текста, которая находится в верхнем регистре до первой строчной буквы.
Например, у меня есть текст: "IV ДЛИННЫЙ ТЕКСТ ЗДЕСЬ и теперь текст заканчивается ЗДЕСЬ"
Я хочу извлечь «IV ДЛИННЫЙ ТЕКСТ ЗДЕСЬ».
Я пробовал что-то вроде этого:
text <- "IV LONG TEXT HERE and now the Text End HERE"
stringr::str_extract_all(text, "[A-Z]")
но я терплю неудачу в регулярном выражении.
Вместо str_extract
используйте str_replace
или str_remove
library(stringr)
# match one or more space (\\s+) followed by
# one or more lower case letters ([a-z]+) and rest of the characters (.*)
# to remove those matched characters
str_remove(text, "\\s+[a-z]+.*")
[1] "IV LONG TEXT HERE"
# or match one or more upper case letters including spaces ([A-Z ]+)
# capture as group `()` followed one or more space (\\s+) and rest of
#characters (.*), replace with the backreference (\\1) of captured group
str_replace(text, "([A-Z ]+)\\s+.*", "\\1")
[1] "IV LONG TEXT HERE"
Вы можете использовать str_extract с шаблоном для соответствия одному символу в верхнем регистре и, возможно, для соответствия пробелам и символам в верхнем регистре, заканчивающимся другим символом в верхнем регистре.
\b[A-Z](?:[A-Z ]*[A-Z])?\b
Объяснение
\b[A-Z]
Граница слова для предотвращения частичного совпадения слов, а затем сопоставление одного символа от A до Z.(?:
Группа без захвата соответствует целому
[A-Z ]*[A-Z]
Сопоставьте необязательные символы A-Z или пробел и сопоставьте символ A-Z)?
Закройте группу без захвата и сделайте ее необязательной\b
Граница словаПример
text <- "IV LONG TEXT HERE and now the Text End HERE"
stringr::str_extract(text, "\\b[A-Z](?:[A-Z ]*[A-Z])?\\b")
Выход
[1] "IV LONG TEXT HERE"
Приведенный ниже пример кода должен работать.
text <- "IV LONG TEXT HERE and now the Text End HERE"
stringr::str_extract_all(text, "\\w.*[A-Z] \\b")
Выход :
[1] 'IV LONG TEXT HERE '
Интерпретация:
Возвращает любой символ слова (\ ш), который появляется ноль или более раз (.*), удовлетворяет диапазону ([А-Я]) в верхнем регистре и заканчивается пробелом (\б).
Вам может понадобиться
stringr::str_replace(text, "([A-Z ]+)\\s+.*", "\\1")