R Language
Correspondance et remplacement de modèle
Recherche…
Introduction
Cette rubrique couvre les modèles de chaînes, leur extraction ou leur remplacement. Pour plus de détails sur la définition de motifs complexes, voir Expressions régulières .
Syntaxe
grep ("query", "subject", optional_args)
grepl ("query", "subject", optional_args)
gsub ("(group1) (group2)", "\\ group #", "subject")
Remarques
Différences par rapport aux autres langues
Les symboles regex échappés (comme \1
) doivent être échappés une seconde fois (comme \\1
), non seulement dans l'argument pattern
, mais aussi dans le replacement
de sub
et gsub
.
Par défaut, le modèle pour toutes les commandes (grep, sub, regexpr) n'est pas une expression régulière compatible avec Perl (PCRE). Par exemple, certaines choses comme les recherches ne sont pas prises en charge. Cependant, chaque fonction accepte un argument perl=TRUE
pour les activer. Voir la rubrique Expressions régulières R pour plus de détails.
Forfaits spécialisés
- stringi
- stringr
Faire des substitutions
# example data
test_sentences <- c("The quick brown fox quickly", "jumps over the lazy dog")
Faisons le renard brun rouge:
sub("brown","red", test_sentences)
#[1] "The quick red fox quickly" "jumps over the lazy dog"
Maintenant, faisons en sorte que les renards "fast"
agissent "fastly"
. Cela ne le fera pas:
sub("quick", "fast", test_sentences)
#[1] "The fast red fox quickly" "jumps over the lazy dog"
sub
ne fait que le premier remplacement disponible, nous avons besoin de gsub
pour le remplacement global :
gsub("quick", "fast", test_sentences)
#[1] "The fast red fox fastly" "jumps over the lazy dog"
Voir Modification des chaînes par substitution pour plus d'exemples.
Trouver des matchs
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
Y a-t-il un match?
grepl()
est utilisé pour vérifier si un mot ou une expression régulière existe dans une chaîne ou un vecteur de caractères. La fonction renvoie un vecteur TRUE / FALSE (ou "Boolean").
Notez que nous pouvons vérifier chaque chaîne pour le mot "renard" et recevoir un vecteur booléen en retour.
grepl("fox", test_sentences)
#[1] TRUE FALSE
Lieux de match
grep
prend une chaîne de caractères et une expression régulière. Il renvoie un vecteur numérique d'index. Cela renvoie la phrase contenant le mot "renard".
grep("fox", test_sentences)
#[1] 1
Valeurs appariées
Pour sélectionner des phrases correspondant à un motif:
# each of the following lines does the job:
test_sentences[grep("fox", test_sentences)]
test_sentences[grepl("fox", test_sentences)]
grep("fox", test_sentences, value = TRUE)
# [1] "The quick brown fox"
Détails
Puisque le modèle "fox"
n'est qu'un mot, plutôt qu'une expression régulière, nous pouvons améliorer les performances (avec grep
ou grepl
) en spécifiant fixed = TRUE
.
grep("fox", test_sentences, fixed = TRUE)
#[1] 1
Pour sélectionner des phrases qui ne correspondent pas à un modèle, on peut utiliser grep
avec invert = TRUE
; ou suivre de sous - -grep(...)
!grepl(...)
ensembles de règles avec -grep(...)
ou !grepl(...)
.
Dans les deux grepl(pattern, x)
et grep(pattern, x)
, le paramètre x
est vectorisé , le paramètre pattern
ne l’est pas. Par conséquent, vous ne pouvez pas les utiliser directement pour faire correspondre le pattern[1]
avec x[1]
, le pattern[2]
contre x[2]
, etc.
Résumé des matchs
Après avoir exécuté, par exemple, la commande grepl
, vous voudrez peut-être avoir un aperçu du nombre de correspondances où TRUE
ou FALSE
. Ceci est utile par exemple dans le cas de grands ensembles de données. Pour ce faire, exécutez la commande summary
:
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
# find matches
matches <- grepl("fox", test_sentences)
# overview
summary(matches)
Match unique et global.
Lorsque vous utilisez des expressions régulières, un modificateur pour PCRE est g
pour la correspondance globale.
Dans R, les fonctions de correspondance et de remplacement ont deux versions: première correspondance et correspondance globale:
sub(pattern,replacement,text)
remplacera la première occurrence du pattern par remplacement dans le textegsub(pattern,replacement,text)
fera la même chose que sub mais à chaque occurrence du patternregexpr(pattern,text)
renverra la position de correspondance pour la première instance de patterngregexpr(pattern,text)
renverra toutes les correspondances.
Quelques données aléatoires:
set.seed(123)
teststring <- paste0(sample(letters,20),collapse="")
# teststring
#[1] "htjuwakqxzpgrsbncvyo"
Voyons comment cela fonctionne si on veut remplacer les voyelles par autre chose:
sub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** wakqxzpgrsbncvyo"
gsub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** w ** HERE WAS A VOWEL** kqxzpgrsbncv ** HERE WAS A VOWEL** ** HERE WAS A VOWEL** "
Voyons maintenant comment on peut trouver une consonne immédiatement suivie par une ou plusieurs voyelles:
regexpr("[^aeiou][aeiou]+",teststring)
#[1] 3
#attr(,"match.length")
#[1] 2
#attr(,"useBytes")
#[1] TRUE
Nous avons une correspondance sur la position 3 de la chaîne de longueur 2, c'est-à-dire: ju
Maintenant, si nous voulons obtenir tous les matchs:
gregexpr("[^aeiou][aeiou]+",teststring)
#[[1]]
#[1] 3 5 19
#attr(,"match.length")
#[1] 2 2 2
#attr(,"useBytes")
#[1] TRUE
Tout cela est vraiment génial, mais cela ne donne que des positions d'utilisation de correspondance et ce n'est pas si facile d'obtenir ce qui est assorti, et voici les regmatches
le seul but est d'extraire la chaîne de regexpr, mais sa syntaxe est différente.
Sauvegardons nos correspondances dans une variable, puis extrayons-les de la chaîne d'origine:
matches <- gregexpr("[^aeiou][aeiou]+",teststring)
regmatches(teststring,matches)
#[[1]]
#[1] "ju" "wa" "yo"
Cela peut sembler étrange de ne pas avoir de raccourci, mais cela permet l'extraction d'une autre chaîne par les correspondances de notre premier (pensez à comparer deux longs vecteurs où vous savez qu'il y a un modèle commun pour le premier mais pas pour le second). comparaison facile):
teststring2 <- "this is another string to match against"
regmatches(teststring2,matches)
#[[1]]
#[1] "is" " i" "ri"
Attention: par défaut, le pattern n'est pas une expression régulière compatible avec Perl, certaines choses comme lookarounds ne sont pas supportées, mais chaque fonction présentée ici permet un argument perl=TRUE
pour les activer.
Trouver des correspondances dans des ensembles de données volumineuses
Dans le cas d'ensembles de données volumineuses, l'appel de grepl("fox", test_sentences)
ne fonctionne pas correctement. Les ensembles de données volumineuses sont, par exemple, des sites Web analysés ou des millions de Tweets, etc.
La première accélération est l'utilisation de l'option perl = TRUE
. Encore plus rapide est l'option fixed = TRUE
. Un exemple complet serait:
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
grepl("fox", test_sentences, perl = TRUE)
#[1] TRUE FALSE
En cas d'extraction de texte, un corpus est souvent utilisé. Un corpus ne peut pas être utilisé directement avec grepl
. Par conséquent, considérez cette fonction:
searchCorpus <- function(corpus, pattern) {
return(tm_index(corpus, FUN = function(x) {
grepl(pattern, x, ignore.case = TRUE, perl = TRUE)
}))
}