Извлечь оба вхождения шаблона Regex - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть входной вектор следующим образом:

input <- c("fdsfs iwantthis (1,1,1,1) fdsaaa   iwantthisaswell (2,3,4,5)", "fdsfs thistoo (1,1,1,1)")

И я хотел бы использовать регулярное выражение для извлечения следующего:

> output
[1] "iwantthis iwantthisaswell" "thistoo"

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

> gsub(".*?[[:space:]](.*?)[[:space:]]\\(.*", "\\1", input)
[1] "iwantthis" "thistoo"  

Но я не могу заставить его работать несколько раз:

    > gsub(".*?[[:space:]](.*?)[[:space:]]\\(.*?[[:space:]](.*?)[[:space:]]\\(.*", "\\1 \\2", input)
[1] "iwantthis iwantthisaswell" "fdsfs thistoo (1,1,1,1)"  

Самое близкое, что мне удалось, это следующее:

library(stringr)
> str_extract_all(input, "(\\S*)\\s\\(")
[[1]]
[1] "iwantthis ("       "iwantthisaswell ("

[[2]]
[1] "thistoo ("

Я уверен, что что-то упустил в своем регулярном выражении (не настолько хорошо), но что?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Это работает в R:

gsub('\\w.+? ([^\\s]+) \\(.+?\\)','\\1', input, perl=TRUE)

Результат:

[1] "iwantthis iwantthisaswell" "thistoo" 

ОБНОВЛЕНО для работы в общем случае.Например, теперь находит «i_wantthisaswell2» путем поиска по пробелам между другими совпадениями.

Использование других предложенных общих входных данных:

general_cases <- c("fdsfs iwantthis (1,1,1,1) fdsaaa   iwantthisaswell (2,3,4,5)", 
                   "fdsfs thistoo (1,1,1,1) ",
                   "GaGa iwant_this (1,1,1,1)", 
                   "lal2!@#$%^&*()_+a i_wantthisaswell2 (2,3,4,5)")
gsub('\\w.+? ([^\\s]+) \\(.+?\\)','\\1', general_cases, perl=TRUE)

результаты:

[1] "iwantthis iwantthisaswell" "thistoo "                 
[3] "iwant_this"                "i_wantthisaswell2"        
0 голосов
/ 10 сентября 2018

Вот вариант с использованием base R

unlist(regmatches(input, gregexpr("\\w+(?= \\()", input, perl = TRUE)))
#[1] "iwantthis"       "iwantthisaswell" "thistoo"  
0 голосов
/ 10 сентября 2018

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

> sapply(str_extract_all(input, "\\S+(?=\\s*\\()"), paste, collapse=" ")
[1] "iwantthis iwantthisaswell" "thistoo"

См. Демоверсию regex . \\S+(?=\\s*\\() извлечет все 1+ непробельных фрагментов из текста до символа (, которому предшествует 0+ пробельных символов. sapply с paste объединит найденные совпадения с пробелом (с collapse=" ").

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

  • \S+ - 1 или более непробельных символов
  • (?=\s*\() - положительный прогноз ((?=...)), который требует наличия 0+ пробельных символов (\s*) и затем ( char (\() непосредственно справа от текущей позиции.
...