R regex Grouping не работает как ожидаемый [дубликат]

Невозможность связывания с соответствующими библиотеками / объектными файлами или компиляция файлов реализации

Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.

В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.

g++ -o test objectFile1.o objectFile2.o -lLibraryName

Здесь libraryName - это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so, но вы должны писать только -lfoo. В Windows этот же файл можно назвать foo.lib, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›. Обязательно не записывайте пробел после -l или -L.

Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в

В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы, и будет создан файл lib (в общем использовании). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies. (путь к файлу lib должен быть добавлен в Linker -> General -> Additional Library Directories). При использовании сторонней библиотеки, которая предоставляется с файлом lib, отказ в этом обычно приводит к ошибке.

Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).

В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».

13
задан Andy G 4 September 2013 в 18:50
поделиться

3 ответа

Не знаю, как это сделать в базе, но вот пакет для ваших нужд:

library(stringr)

str_match_all(s, r)
#[[1]]
#     [,1]     [,2]  
#[1,] "xy1234" "1234"
#[2,] "xy567"  "567" 

Многие функции stringr также имеют параллели в базе R, поэтому вы также можете достичь этого, не используя stringr.

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

sapply(regmatches(s,gregexpr(r,s))[[1]], function(m) regmatches(m,regexec(r,m)))
11
ответ дан bschneidr 26 August 2018 в 02:43
поделиться

strapplyc в пакете gsubfn делает следующее:

> library(gsubfn)
>
> strapplyc(s, r)
[[1]]
[1] "1234" "567" 

Попробуйте ?strapplyc для получения дополнительной информации и примеров.

Связанные функции

1) Обобщение strapplyc есть strapply в одном пакете. Он принимает функцию, которая вводит захваченные части каждого совпадения и возвращает выход функции. Когда функция c, она уменьшается до strapplyc. Например, предположим, что мы хотим вернуть результаты как числовые:

> strapply(s, r, as.numeric)
[[1]]
[1] 1234  567

2) gsubfn является другой связанной функцией в том же пакете. Это похоже на gsub, за исключением того, что строка замены может быть функцией замены (или списком замещения или заменяющим прото-объектом). Функция замены вводит захваченные части и выводит замену. Замена заменяет совпадение во входной строке. Если используется формула, как в этом примере, правая часть формулы рассматривается как тело функции. В этом примере мы заменим соответствие на XY{#}, где # в два раза соответствует номеру ввода.

> gsubfn(r, ~ paste0("XY{", 2 * as.numeric(x), "}"), s)
[1] "XY{2468}wz98XY{1134}"

UPDATE: добавлены примеры strapply и gsubfn.

8
ответ дан G. Grothendieck 26 August 2018 в 02:43
поделиться

Для базового R-решения, как только использовать gsub() для завершения обработки строк, извлеченных из gregexpr() и regmatches()?

s <- "xy1234wz98xy567"
r <- "xy(\\d+)"

gsub(r, "\\1", regmatches(s,gregexpr(r,s))[[1]])
# [1] "1234" "567" 
12
ответ дан Josh O'Brien 26 August 2018 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: