2
votes

RegEx pour l'extraction de modèles numériques

J'ai une chaîne complexe comme celle-ci:

gsub("[^0-9\\.-][^\\s]+", "", y)

La valeur 0.4 est ce qui est intéressant - donc toujours le modèle numérique juste après Valeur: code>

Jusqu'à présent, j'ai essayé ce qui suit:

y <- gsub(".*Value : \\s*|\\\\.*", "", x)

Suivi par:

x <- "Lab ID : 11.11111 4\\nStatus : Final(F)\\nValue : 0.4 %\\nLow range:  0\\nHigh range:  2\\n"

Le défi est que le modèle numérique peut prendre n'importe quelle valeur positive ou négative et est parfois suivi de modèles plus numériques (par exemple 0.4 10E9 / ml ). De plus, cela est compliqué par le fait que Value: peut également être suivi de valeurs de caractères (par exemple Value: pending \\ nLow ...

J'essaye de réaliser l'extraction en une seule ligne de manière fiable.

Des idées?


1 commentaires

Pouvez-vous partager plus de données d'entrée?


3 Réponses :


0
votes

Nous pouvons utiliser sub pour faire correspondre la chaîne entière et remplacer par le modèle qui correspond à la valeur du chiffre:

x <- "Lab ID : 11.11111 4\\nStatus : Final(F)\\nValue : pending -0.4 10E9/ml %\\nLow range:  0\\nHigh range:  2\\n"

sub(".*Value\\s*:[\\s[:alpha:]]*(-?\\d+\\.\\d+).*", "\\1", x, perl = TRUE)
# [1] "-0.4"

Notez que j'ai modifié la chaîne d'entrée en démontrer que cette expression régulière fonctionne pour tous les cas spécifiés par OP.


0 commentaires

0
votes

Vous pouvez utiliser

regmatches(x, regexpr("Value\\s*:\\s*\\K-?\\d+(?:\\.\\d+)?", x, perl=TRUE))

Voir la démo regex a > et la Démo en ligne R .

Détails p>

  • Value - une sous-chaîne littérale
  • \ s *: \ s * - un deux-points entre 0+ espaces blancs
  • \ K - opérateur de réinitialisation de correspondance qui supprime tout le texte correspondant jusqu'à présent de la mémoire tampon de correspondance
  • -? - un signe moins facultatif
  • \ d + - 1+ chiffres
  • (?: \. \ d +)? - une séquence facultative d'un point et 1+ chiffres.


0 commentaires

0
votes

Je ne sais pas si ce RegEx couvrirait toutes vos entrées possibles:

[0-9\s\.]+%

 entrez la description de l'image ici


0 commentaires