Вопрос

Как использовать 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"
Это было полезно?

Решение

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

  

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

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

Другие советы

Вместо этого используйте strsplit :

test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]

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

Функции 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"

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

Сообщается, что те, кто работает,

Это ограничение в 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.)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top