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

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 texte

  • gsub(pattern,replacement,text) fera la même chose que sub mais à chaque occurrence du pattern

  • regexpr(pattern,text) renverra la position de correspondance pour la première instance de pattern

  • gregexpr(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)
  }))
} 


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow