Mais de 9 referências anteriores em gsub ()
Pergunta
Como usar gsub com mais de 9 backreferences? Eu esperaria a saída no exemplo abaixo para ser "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"
Solução
Consulte expressões regulares com os R Idioma :
Você pode usar o
\1
backreferences através\9
no texto de substituição ao texto Reinsira acompanhado por um href="http://www.regular-expressions.info/brackets.html" rel="noreferrer"> grupo . Não há nenhum texto de substituição token para o jogo em geral. Coloque toda a regex em um grupo de captura e, em seguida, usar\1
.
Mas com PCRE você deve ser capaz de usar href="http://www.regular-expressions.info/named.html" grupos nomeados . Portanto, tente (?P<
name
>
regex
)
para nomeação groupd e (?P=
name
)
como referência anterior.
Outras dicas
Use strsplit
vez:
test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]
Foi o meu entendimento de que \ 10 que nós entendida como backreference 0 seguido por um dígito de 1. Eu acho que 9 é o máximo.
As funções stri_replace_*_regex
do href="http://stringi.rexamine.com" rel="nofollow"> Stringi pacote não tem tais limitações:
library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"
Se você quiser acompanhar o grupo 1º de captura com 1, use por exemplo.
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"
De acordo com a neste site , referências anteriores \ 10 a \ 99 obras em algumas línguas, mas não a maioria.
Aqueles que são relatados ao trabalho são
Esta limitação a 9 backreferences é específico para o sub()
e gsub()
functions, não para funções como grep()
e similares. Suporte para mais de 9 backreferences em R implica a utilização de PCRE expressão regular (ou seja, o argumento perl=TRUE
); No entanto, mesmo com esta opção, o sub () e gsub () funções não apoiá-lo.
A documentação R é explícito sobre este ponto: ver ?regexp
There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).
Além disso, a idéia de usar grupos de captura nomeados para contornar esta limitação está fadado ao fracasso desde grupos de captura nomeados não são suportados com sub () funções.
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.)