2016-01-21 3 views
2

Je souhaite diviser une chaîne de caractères en deux groupes. La structure de la chaîne est assez simple, mais je n'ai pas réussi à la faire fonctionner.regex dans R "mange" une partie de la chaîne

txt <- "text12-01-2016" 

C'est toujours des lettres, suivies d'une date, et la date commence évidemment par un nombre. J'ai essayé la regex suivante à https://regex101.com/ et obtenir efficacement la chaîne correctement séparés:

([a-zA-Z]*)([0-9].*) 
1. "text" 
2. "12-01-2016" 

Mais quand j'essaie en R il échoue:

strsplit(a[1],split = "([a-zA-Z]*)([0-9]*)") 
[[1]] 
[1] "" " " "" "." " " "" " " "" "-" "" "-" "" 

Et si je vous présente deux paires de crochets, il « mange » le dernier caractère du premier groupe, et la première de la seconde:

strsplit(txt,split = "([[a-zA-Z]]*)([[0-9]]*)") 
[[1]] 
[1] "tex"  "2-01-2016" 

Peu importe si j'utilise perl=TRUE. Le résultat est cohérent aussi si j'utilise stringi::stri_split, donc c'est un problème dans mon regex.

Quelle est la regex correcte à utiliser dans ce cas?

Répondre

5

Le « problème » est ici que vous avez un regex pour correspondant, pas pour division.

Vous pouvez utiliser le following PCRE regex avec strsplit:

strsplit(txt,split = "(?<=[a-zA-Z])(?=[0-9])", perl=T) 
[[1]] 
[1] "text"  "12-01-2016" 

Le regex correspondra à l'endroit situé entre une lettre et un chiffre et StrSplit se partageront le résultat. Vous pouvez l'inscrire plus loin si vous en avez besoin.

Si vous voulez utiliser votre regex, utilisez str_match de stringr:

> library(stringr) 
>str_match(txt, "([a-zA-Z]*)([0-9].*)") 
    [,1]    [,2] [,3]   
[1,] "text12-01-2016" "text" "12-01-2016"