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?
3 Réponses :
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.
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.
Pouvez-vous partager plus de données d'entrée?