2016-07-01 1 views
-1
my_string = "2011, this year I made 750,000 dollars" 

Y at-il une façon élégante de faire correspondre "2011" et "750,000" dans la chaîne ci-dessus. L'idée est d'extraire des valeurs numériques quand cela ressemble à des valeurs numériques, par exemple \d+ ou \d+[\.,]?\d* en fonction de la présence d'une virgule aprèsexpression régulière dans R, un match que si les choses substring après

J'ai essayé mais ça ne correspond pas exactement à ce que je voulais, j'ai "2011, "qui est pas bon

library(stringr) 
str_match_all(fkin, "(\\d+[\\.,]?\\d*) 

Voici mon resut prévu:

"2011" "750,000" 
+1

http://stackoverflow.com/questions/17009628/extracting-numbers-from-string-in-r – Sumedh

Répondre

1

Vous pouvez faire:

[0-9]+(?:[,.][0-9]+)* 

C'est très élégant, je l'ai essayé devant un miroir.

+0

désolé ça marche, ép u, ne connaissait pas les parenthèses imbriquées –

+0

@hansglick: Je mis à jour mon répondez, actualisez la page. –

+0

@ casimir, désolé ce que le sens de?: –

1

Voici une expression rationnelle approche de base R pur l'extrait entier ou flotter des valeurs qui ne font pas partie de la chaîne de chiffres séparés par un tiret:

> str <- "2011, this year I made 750,000 dollars and 750,000-589 here" 
> regmatches(str, gregexpr('(?<!\\d-)\\b\\d+(?:[,.]\\d+)?+(?!-)', str, perl=T))[[1]] 
[1] "2011" "750,000" 

Voir la IDEONE demo et un regex demo. Étant donné que la regex contient des solutions de remplacement, vous devez spécifier l'argument perl=TRUE.

explication des motifs:

  • (?<!\d-) - un lookbehind négatif à défaut du match quand un chiffre avec un hyhen précède l'emplacement actuel
  • \b\d+ - une limite de mot (avant le chiffre suivant, il ne peut pas être un mot char - lettre, chiffre ou _)
  • (?:[,.]\d+)?+ - un groupe non-capturant ((?:...)) correspondant à 1 ou 0 séquences d'une virgule ou d'un point ([,.]) Suivie (et cette séquence est adaptée possessivement (voir ?+) avec 1 ou plusieurs chiffres afin que le moteur regex n'a pas vérifié pour un trait d'union après \b\d+)
  • (?!-) - un loookahead négatif qui ne parvient pas en jeu s'il y a un trait d'union après les chiffres détectés.