Как извлечь текст слева от круглых скобок с помощью R? - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть

String=“Text1.Text2(er2019).Text3(246)text.”

Требуемый вывод:

String=“Text2.Text3”

Я хочу извлечь только Text2, Text3, - все слева от ( в2-й и 3-й элементы.Меня не интересует первый элемент Text1.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019
library(stringr)
String <- 'Text1.Text2(er2019).Text3(246)text.'
Matches <- str_extract_all(string = String, pattern =  "\\.[^()]+\\(")[[1]]
Matches <- str_replace_all(string = Matches, pattern = "^\\.|\\($", replacement = "")
  1. Используя str_extract_all из пакета stringr, мы извлекли весь текст, расположенный между . и и (.
  2. Используя str_replace_all, мы удалили все ведущие . и каждый завершающий ( из извлеченных совпадений.

Чтобы получить желаемый результат, вы можете вставить все извлеченные совпадения, свернувшись с ., например:

paste(Matches, collapse = ".")
0 голосов
/ 23 февраля 2019
str = 'Text1.Text2(er2019).Text3(246)text.'
pat = '.*?\\.(.*?)\\(.*?\\)\\.(.*?)\\(.*'
substr =  '\\1\\.\\2'
sub(pat, substr, str)

Я понял это, перейдя на regex101.com и играя до тех пор, пока не получу результаты.На regex101 я обнаружил, что этот шаблон .*?\.(.*?)\(.*?\)\.(.*?)\(.* дал желаемый результат, но поскольку R обрабатывает \ как специальный символ, каждый \ становится \\.

Вы хотите отбросить всетекст до и включая первый период.Таким образом, весь этот текст захвачен .*?\\..? останавливает этот шаблон при первом совпадении, а не при последнем совпадении (называемом lazy match).

Затем мы хотим сохранить текст после этого первого периода до первого(.(.*?)\\( назначил текст между . и ( для группы 1. Помещение () вокруг шаблона создает capturing group, который вы можете использовать при замене.

Затем отбрасываем текст в скобках \\(.*?\\)\\..И мы повторяем образец для группы 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...