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"
Foi útil?

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.

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.)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top