J'ai un vecteur de chaînes extrêmement désordonnées. Voici un exemple:Comment puis-je extraire la partie sans correspondance d'une chaîne dans R avec des expressions régulières?
library(tidyverse)
library(stringr)
strings <- tibble(
name = c("lorem 11:07:59 86136-1-sed",
"ipsum 14:35:57 S VARNAME-ut",
"dolor 10:37:53 1513 -2-perspiciatis",
"sit 10:48:25",
"amet 13:52:1365293-2-unde",
"consectetur 11:53:1 16018-2-omnis",
"adipiscing 11:19 17237-2-iste"
)
)
strings_out <- strings %>%
mutate(heads = str_extract(name, "^.*?\\s\\d{1,2}:\\d{1,2}:\\d{1,2}")) %>%
mutate(ends = str_replace(name, "^.*?\\s\\d{1,2}:\\d{1,2}:\\d{1,2}", ""))
strings_out[,2:3]
#> # A tibble: 7 x 2
#> heads ends
#> <chr> <chr>
#> 1 lorem 11:07:59 86136-1-sed
#> 2 ipsum 14:35:57 S VARNAME-ut
#> 3 dolor 10:37:53 1513 -2-perspiciatis
#> 4 sit 10:48:25
#> 5 amet 13:52:13 65293-2-unde
#> 6 consectetur 11:53:1 16018-2-omnis
#> 7 <NA> adipiscing 11:19 17237-2-iste
Donc ici, j'ai des chaînes qui comportent un texte, suivi d'un temps qui peuvent ou peuvent ne pas être correctement saisi, puis un peu plus du texte. Je veux extraire juste les extrémités des chaînes après le temps, cependant elles n'ont aucun modèle qui semble correspondre bien à une expression régulière potentielle en utilisant str_extract
. Je peux facilement faire correspondre la première moitié des chaînes, montré dans heads
. Cependant, la seule façon que j'ai trouvé pour extraire la dernière moitié est d'utiliser str_replace
avec une chaîne vide, comme indiqué dans ends
.
J'ai essayé d'inclure toutes les erreurs courantes que j'ai remarquées dans cette liste: pas de motif quant à la césure, l'espacement ou le contenu des chaînes après le temps, pas d'espace garanti entre le temps et la moitié désirée chiffres manquants ou même deux-points.
Ce que je voudrais faire est de pouvoir utiliser str_extract
pour obtenir quelque chose de proche de ce que j'ai obtenu avec str_replace
. La principale différence est que pour les erreurs où ce travail ne regex toujours pas, str_extract
me donne un NA
qui est facile à filtrer et corriger manuellement, mais str_replace
seulement des copies dans toute la chaîne comme on le voit dans la ligne 7.
I Je pense que je pourrais faire cela avec des méthodes plus hacky, comme obtenir tous les NA
et corriger manuellement dans Excel ou quelque chose, mais j'ai été surpris que je ne pouvais pas comprendre comment retourner la partie inégalée d'une chaîne en général, malgré un tas de recherches et en essayant différentes expressions régulières qui incluent (^)
et [^]
. Des idées?
Quel est le résultat escompté? –
Désolé si ce n'était pas clair. Le résultat souhaité est la deuxième colonne, à l'exception du retour NA où la première colonne en a une. Je me suis rendu compte que je pouvais simplement les remplacer par «NA» aux indices corrects, mais j'ai trouvé curieux que le concept de «retourner la partie inégalée de la chaîne» semblait difficile à faire. –