#========================================================================================== # Expressões Regulares # Walmes Zeviani #========================================================================================== #------------------------------------------------------------------------------------------ # documentação R de expressões regulares help(regex, help_type="html") #------------------------------------------------------------------------------------------ # trabalhando com expressões regulares x <- colors() # objeto com os nomes das cores do R pos <- grep("red", x) # procura pela cor vermelha, retorna a posição de ocorrência no vetor x[pos] help(grep, help_type="html") grep("red", x, value=TRUE) # procura o vermelho, retorna o resultado #------------------------------------------------------------------------------------------ # ancoras: ^, $, \\b grep("^red", x, value=TRUE) grep("red$", x, value=TRUE) grep("^red$", x, value=TRUE) #------------------------------------------------------------------------------------------ # representantes: ., [ ], [^ ] y <- c("ac","abc","abbc","abbbc","a0c","a01c") grep("a.c", y, value=TRUE) grep("a..c", y, value=TRUE) grep("a[a-z]c", y, value=TRUE) grep("a[0-9]c", y, value=TRUE) grep("a[a-f]c", y, value=TRUE) grep("a[aeiou]c", y, value=TRUE) grep("a[a-z0-9]c", y, value=TRUE) grep("a[a-z][a-z]c", y, value=TRUE) grep("a[^b]c", y, value=TRUE) grep("a[^0-9]c", y, value=TRUE) grep("a[0-9]c", y, value=TRUE, invert=FALSE) grep("a[0-9]c", y, value=TRUE, invert=TRUE) #------------------------------------------------------------------------------------------ # quantificadores: ?, *, +, {} grep("ab?c", y, value=TRUE) grep("ab*c", y, value=TRUE) grep("ab+c", y, value=TRUE) grep("a[b][b]c", y, value=TRUE) grep("ab{2}c", y, value=TRUE) grep("ab{2}b?c", y, value=TRUE) #------------------------------------------------------------------------------------------ # logico: | grep("orange|dark", x, value=TRUE) grep("orange$|^dark", x, value=TRUE) #------------------------------------------------------------------------------------------ # ex 1 tel <- c("(41) 1314-1516","(42) 0948-8341","(67) 9909-4187","(42) 7573-4109") grep("^\\(41", tel, value=TRUE) grep("^\\(41|^\\(42", tel, value=TRUE) grep("^\\(4[12]", tel, value=TRUE) grep("^\\(41", tel, value=TRUE, invert=TRUE) #------------------------------------------------------------------------------------------ # ex 2 dat <- c("02/03/2011","09/09/2010","31/12/10") grep("^[0-9]{2}/[0-9]{2}/[0-9]{4}$", dat, value=TRUE, invert=TRUE) dat <- c("02/03/2011","09/09/2010","31/12/10", "02/31/1999") grep("^[0-9]{2}/[01][0-9]/[0-9]{4}$", dat, value=TRUE, invert=TRUE) #------------------------------------------------------------------------------------------ # estudando o padrão das senhas senha <- read.table("http://www.leg.ufpr.br/~walmes/ensino/ce223-2011-01/senha.txt", header=TRUE, sep="\t", stringsAsFactors=FALSE, quote="") str(senha) length(grep("a", senha$password)) letters freq <- sapply(letters, function(letra){ length(grep(letra, senha$password)) }) barplot(freq) barplot(sort(freq)) num <- c(0:9) names(num) <- num num freq <- sapply(num, function(letra){ length(grep(letra, senha$password)) }) barplot(freq) barplot(sort(freq)) email <- c("@gmail","@hotmail","@yahoo") freq <- sapply(email, function(letra){ length(grep(letra, senha$email)) }) pie(freq) freq aux <- length(grep("@gmail|@hotmail|@yahoo", senha$email, invert=TRUE)) freq <- c(freq, outros=aux) pie(freq) length(grep("^[A-Za-z].*[0-9]$", senha$password))/length(senha$password) length(grep("^[0-9].*[A-Za-z]$", senha$password))/length(senha$password) length(grep("123", senha$password))/length(senha$password) tipo <- c("^[0-9]*$","^[a-z]*$") freq <- sapply(tipo, function(letra){ length(grep(letra, senha$password)) }) pie(freq) freq #------------------------------------------------------------------------------------------ # busca aproximada nomes <- c("Júlio","Julio","Júlia","Juliano","Julian","João","Joao","joão") agrep("julio", nomes, value=TRUE, max.dist=0.3) agrep("julio", nomes, value=TRUE, max.dist=0.5) #------------------------------------------------------------------------------------------