Admito que essas perguntas sobre regex já foram feitas antes, mas ainda estou com dificuldades para encontrar uma solução funcional (mesmo depois de consultar o ChatGPT).
Tomando o seguinte exemplo: text <- c("test1", "test2 | ", "test3 | test3 | test 3", "test4 | test4 | test 4 | test4")
quero remover todo o texto que começa na n-ésima (no meu caso, a segunda) ocorrência de " | ".
Então a saída deve ser:output <- c("test1", "test2 | ", "test3 | test3", "test4 | test4")
Consegui fazer funcionar quando há até dois textos " | " com str_remove(text, "( \\| [^\\|]+$)")
, mas isso não se generaliza para casos com mais de duas ocorrências desse padrão correspondente.
Uma solução pode ser extrair a string de interesse em vez de remover as partes indesejadas. Para isso, você pode usar uma expressão regular que corresponda aos três casos de interesse, em ordem decrescente de comprimento:
[:graph:]+ \\| [:graph:]+
,[:graph:]+ \\|
ou[:graph:]+
.Você pode usar
onde
\|
é seu delimitador.*?
corresponde a qualquer texto (exceto caracteres de quebra de linha, adicione(?s)
no início do padrão para que ele corresponda em todas as linhas)str_replace
é necessário manter o primeiro valor do grupo após remover o valor da correspondência.Veja a demonstração do R online (e aqui está a demonstração do regex resultante ).
Outra ideia é usar a função base R
sub
com esse padrão.Veja esta demonstração em regex101 ou uma demonstração R em tio.run
A parte desejada é capturada pelo primeiro grupo que também é usado como substituição .
.*
consome o resto da string (será removido). Entre os símbolos de pipe uma classe de caracteres negada caracteres diferentes de|
. O lazy[^|]*?
before\s*|
é usado para evitar que termine em um espaço em branco.Para ajustá-lo à enésima ocorrência, substitua
[^|]*\\|
por(?:[^|]*\\|){n}
( regex101 demo com n=2 ). Se isso não funcionar devido à falta de suporte para quantificadores preguiçosos (demo funciona), anexe,perl=T
.