Более 9 обратных ссылок в gsub()
Как использовать 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"
Ответы
Ответ 1
Смотрите Регулярные выражения с языком R:
Вы можете использовать обратные ссылки \1
через \9
в заменяемом тексте для повторного ввода текста, сопоставленного named groups. Поэтому попробуйте (?P<
name
>
regex
)
для именования групп и (?P=
name
)
как обратную ссылку.
Ответ 2
Вместо этого используйте strsplit
:
test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]
Ответ 3
Я понимал, что \10 мы понимаем как backreference 0, за которым следует цифра 1. Я думаю, что 9 - это максимум.
Ответ 4
Функции stri_replace_*_regex
из пакета stringi не имеют таких ограничений:
library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"
Если вы хотите следовать первой группе захвата с 1, используйте, например,
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"
Ответ 5
Согласно этот сайт, обратные ссылки\от 10 до 99 работают на некоторых языках, но не в большинстве.
Те, о которых сообщают, работают
Ответ 6
Это ограничение для 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.)