Более 9 обратных ссылок в gsub () - PullRequest
11 голосов
/ 09 сентября 2009

Как использовать gsub с более чем 9 обратными ссылками? Я ожидаю, что в приведенном ниже примере вывод будет "e, g, i, j, o".

> test <- "abcdefghijklmnop"
> gsub("(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)", "\\5, \\7, \\9, \\10, \\15", test, perl = TRUE)
[1] "e, g, i, a0, a5"

Ответы [ 6 ]

9 голосов
/ 09 сентября 2009

См. Регулярные выражения с языком R :

Вы можете использовать обратные ссылки от \1 до \9 в тексте замены, чтобы повторно вставить текст, соответствующий группе захвата . Там нет замены текстового токена для общего соответствия. Поместите все регулярные выражения в группу захвата и затем используйте \1.

Но с помощью PCRE вы сможете использовать именованные группы . Так что попробуйте (?P<name>regex) для именования групп и (?P=name) в качестве обратной ссылки .

4 голосов
/ 09 сентября 2009

Используйте strsplit вместо:

test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]
3 голосов
/ 09 сентября 2009

Насколько я понимаю, \ 10 мы будем понимать как обратную ссылку 0, за которой следует цифра 1. Я думаю, что 9 - это максимум.

2 голосов
/ 13 июня 2014

Функции stri_replace_*_regex из пакета stringi не имеют таких ограничений:

library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"

Если вы хотите следовать за 1-й группой захвата с 1, используйте, например,

stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"
1 голос
/ 09 сентября 2009

Согласно этому сайту , обратные ссылки с \ 10 до \ 99 работают на некоторых языках, но не на большинстве.

Те, о которых сообщают, что работают

0 голосов
/ 25 октября 2015

Это ограничение в 9 обратных ссылок относится только к функциям sub() и gsub(), а не к таким функциям, как grep() и т.п. Поддержка более 9 обратных ссылок в R подразумевает использование регулярного выражения PCRE (то есть аргумент perl=TRUE); однако даже с этой опцией функции sub () и gsub () не поддерживают ее.

Документация R явно указана по этому вопросу: см. ?regexp

There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).

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

regexpr and gregexpr support ‘named capture’. If groups are named,
e.g., "(?<first>[A-Z][a-z]+)" then the positions of the matches are also
returned by name. (Named backreferences are not supported by sub.)
...