L'extraction d'une chaîne de caractères entre deux autres cordes en R
Je suis en train d'essayer de trouver un moyen simple d'extraire un inconnu substring (pourrait être n'importe quoi) qui apparaissent entre les deux sous-chaînes. Par exemple, j'ai une chaîne de caractères:
a<-" anything goes here, STR1 GET_ME STR2, anything goes here"
J'ai besoin d'extraire la chaîne de GET_ME
qui est entre STR1 et STR2 (sans les espaces).
Je suis en train str_extract(a, "STR1 (.+) STR2")
, mais je suis toute la durée du match
[1] "STR1 GET_ME STR2"
Je peux bien sûr la bande de la connus des chaînes, pour isoler la sous-chaîne dont j'ai besoin, mais je pense qu'il devrait être d'une façon plus propre de le faire en utilisant un mot de l'expression régulière.
utiliser les ceci fantastique fonction
Il n'y a aucune réponse correcte dans la Extraire une chaîne de mots entre deux mots dans la R, j'ai ré-ouvert cette question. Si ce poste devrait être migrés avec celui-là, s'il vous plaît laissez les modérateurs savent.
regcapturedmatches(test, gregexpr('STR1 (.+?) STR2', test, perl = TRUE))
Il n'y a aucune réponse correcte dans la Extraire une chaîne de mots entre deux mots dans la R, j'ai ré-ouvert cette question. Si ce poste devrait être migrés avec celui-là, s'il vous plaît laissez les modérateurs savent.
OriginalL'auteur Sasha | 2016-08-22
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
str_match
avecSTR1 (.*?) STR2
(notez les espaces sont "significatifs", si vous voulez juste correspondre à quelque chose entre les deuxSTR1
etSTR2
utilisationSTR1(.*?)STR2
). Si vous avez de multiples occurrences, l'utilisationstr_match_all
.Un autre chemin à l'aide de la base de R
regexec
(pour obtenir le premier match):Le
?
ici est une partie d'un lazy (non-greedy) quantificateur. Il correspond aussi peu de caractères que possible, tout en*
va correspondre autant que possible. Donc,STR1 .*? STR2
regex correspondSTR1 xx STR2
, etSTR1 .* STR2
correspondraSTR1 xx STR2 zzz STR2
. Si vous vous attendez à plusieurs matchs dans votre entrée, paresseux quantificateur est un must ici. Aussi, pour info: si la partie de la chaîne entreSTR1
etSTR2
peut contenir des sauts de ligne, vous avez besoin d'ajouter le modèle avec(?s)
:"(?s)STR1 (.*?) STR2"
.Pouvez-vous m'expliquer pourquoi sur la terre
str_match
de sortie est une matrice? Il semble donc inopportun, en particulier lors de la sortie seulement la plupart des gens veulent toujours est[,2]
Je ne serais pas d'accord parce que si quelqu'un ne veut
[,2]
, ils doivent utiliser un simpleregmatches(a, regexpr("STR1\\s*\\K.*?(?=\\s*STR2)", a, perl=TRUE))
. Avecstringr
, il est également possible d'utiliser un modèle de typestr_extract_all(a, "(?s)(?<=STR1\\s{0,1000}).*?(?=\\s*STR2)")
(même si, pour une raison quelconque, l'espace est toujours inclus dans le match, et c'est plutôt hacky).str_match
est un sauveur de vie lorsque vous devez retourner tous les matches et des captures. Aussi, le modèle qui peut être utilisé avecstr_match
est beaucoup plus efficace.combo étouffe sur une expression qui est bien en stringr, de sorte que votre expression
str_extract_all(a, "(?s)(?<=STR1\\s{0,1000}).*?(?=\\s*STR2)")
ne peut pas être appliquée commeregmatches(a,regexpr("(?s)(?<=STR1\\s{0,1000}).*?(?=\\s*STR2)", a, perl = TRUE) )
Pourquoi est-ce?OriginalL'auteur Wiktor Stribiżew
Voici une autre manière, en utilisant la base de R
De sortie:
OriginalL'auteur Ulises Rosas-Puchuri