Dans R, est-il possible d'extraire une capture de groupe à partir d'une correspondance d'expression régulière? Pour autant que je sache, aucun grep
, grepl
, regexpr
, gregexpr
, sub
ou gsub
renvoyer les captures de groupe.
J'ai besoin d'extraire des paires clé-valeur à partir de chaînes qui sont encodées ainsi:
\((.*?) :: (0\.[0-9]+)\)
Je peux toujours simplement faire plusieurs greps à correspondance complète, ou faire un traitement extérieur (non-R), mais j'espérais pouvoir tout faire dans R. Y a-t-il une fonction ou un package qui fournit une telle fonction pour faire cela?
regex
r
capture
capture-group
Daniel Dickison
la source
la source
str_match_all()
pour faire correspondre tous les groupes dans une regex[,1]
est la correspondance complète.[,2:3]
sont les groupes capturés.gsub fait cela, à partir de votre exemple:
vous devez double échapper les \ s entre les guillemets, puis ils fonctionnent pour l'expression régulière.
J'espère que cela t'aides.
la source
gsub
page de manuel R a vraiment besoin d'un exemple montrant que vous avez besoin de '\\ 1' pour échapper à une référence de groupe de capture.Essayez
regmatches()
etregexec()
:la source
regmatches
que je n'ai jamais vu auparavantregexec
renvoie une liste contenant des informations concernant uniquement l'emplacement des correspondances,regmatches
obligeant donc l'utilisateur à fournir la chaîne à laquelle appartenait la liste de correspondances.gsub () peut le faire et ne renvoyer que le groupe de capture:
Cependant, pour que cela fonctionne, vous devez sélectionner explicitement des éléments en dehors de votre groupe de capture comme mentionné dans l'aide de gsub ().
Donc, si votre texte à sélectionner se trouve au milieu d'une chaîne, l'ajout de. * Avant et après le groupe de capture devrait vous permettre de ne le retourner.
gsub(".*\\((.*?) :: (0\\.[0-9]+)\\).*","\\1 \\2", "(sometext :: 0.1231313213)") [1] "sometext 0.1231313213"
la source
J'aime les expressions régulières compatibles avec Perl. Probablement quelqu'un d'autre le fait aussi ...
Voici une fonction qui fait des expressions régulières compatibles avec Perl et correspond aux fonctionnalités des fonctions dans d'autres langages auxquels je suis habitué:
la source
C'est ainsi que j'ai fini par contourner ce problème. J'ai utilisé deux expressions régulières distinctes pour faire correspondre les premier et deuxième groupes de capture et exécuter deux
gregexpr
appels, puis extraire les sous-chaînes correspondantes:la source
expr "xyx0.0023xyxy" : '[^0-9]*\([.0-9]\+\)'
Solution avec
strcapture
duutils
:la source
Comme suggéré dans le
stringr
package, cela peut être réalisé en utilisant soitstr_match()
oustr_extract()
.Adapté du manuel:
Extraire et combiner nos groupes:
Indiquer les groupes avec une matrice de sortie (nous nous intéressons aux colonnes 2+):
la source
_all
suffixe desstringr
fonctions concernées .Cela peut être fait en utilisant le package unglue , en prenant l'exemple de la réponse sélectionnée:
Ou à partir d'une trame de données
vous pouvez obtenir le regex brut à partir du modèle unglue, éventuellement avec la capture nommée:
Plus d'infos: https://github.com/moodymudskipper/unglue/blob/master/README.md
la source