Em R, é possível extrair a captura de grupo de uma correspondência de expressão regular? Tanto quanto eu posso dizer, nenhum de grep
, grepl
, regexpr
, gregexpr
, sub
, ou gsub
retornar a captura do grupo.
Preciso extrair pares de valor-chave de strings que são codificadas assim:
\((.*?) :: (0\.[0-9]+)\)
Sempre posso fazer vários greps de correspondência total ou fazer algum processamento externo (não R), mas esperava poder fazer tudo dentro de R. Há uma função ou pacote que fornece tal função para fazer isso?
regex
r
capture
capture-group
Daniel Dickison
fonte
fonte
str_match_all()
para combinar todos os grupos em uma regex[,1]
é a correspondência completa.[,2:3]
são os grupos capturados.gsub faz isso, a partir do seu exemplo:
você precisa fazer um escape duplo de \ s nas aspas para que funcionem para o regex.
Espero que isto ajude.
fonte
gsub
manual R precisa muito de um exemplo mostrando que você precisa de '\\ 1' para escapar de uma referência de grupo de captura.Experimente
regmatches()
eregexec()
:fonte
regmatches
que eu nunca tinha visto antesregexec
retorna uma lista contendo informações apenas sobre a localização das correspondências, portanto,regmatches
exige que o usuário forneça a string à qual a lista de correspondências pertence.gsub () pode fazer isso e retornar apenas o grupo de captura:
No entanto, para que isso funcione, você deve selecionar explicitamente os elementos fora do seu grupo de captura, conforme mencionado na ajuda do gsub ().
Portanto, se o texto a ser selecionado estiver no meio de alguma string, adicionar. * Antes e depois do grupo de captura permitirá que você apenas o retorne.
gsub(".*\\((.*?) :: (0\\.[0-9]+)\\).*","\\1 \\2", "(sometext :: 0.1231313213)") [1] "sometext 0.1231313213"
fonte
Eu gosto de expressões regulares compatíveis com perl. Provavelmente outra pessoa também ...
Aqui está uma função que faz expressões regulares compatíveis com perl e corresponde à funcionalidade de funções em outras linguagens com as quais estou acostumado:
fonte
Foi assim que acabei contornando esse problema. Usei duas regexes separadas para combinar o primeiro e o segundo grupos de captura e executei duas
gregexpr
chamadas, em seguida, retirei as substrings correspondentes:fonte
expr "xyx0.0023xyxy" : '[^0-9]*\([.0-9]\+\)'
Solução com
strcapture
a partir doutils
:fonte
Conforme sugerido no
stringr
pacote, isso pode ser feito usandostr_match()
oustr_extract()
.Adaptado do manual:
Extraindo e combinando nossos grupos:
Indicando grupos com uma matriz de saída (estamos interessados nas colunas 2+):
fonte
_all
sufixo para asstringr
funções relevantes .Isso pode ser feito usando o pacote unglue , tomando o exemplo da resposta selecionada:
Ou a partir de um quadro de dados
você pode obter o regex bruto do padrão de descolagem, opcionalmente com a captura nomeada:
Mais informações: https://github.com/moodymudskipper/unglue/blob/master/README.md
fonte