Menu
Coddy logo textTech

Поиск в строках

Часть раздела Логика и потоки выполнения путешествия по R на Coddy. Урок 4 из 64.

grepl(pattern, x) возвращает TRUE для каждого элемента x, который содержит pattern. Добавьте fixed = TRUE, чтобы искать точное совпадение символов. Без этого pattern является регулярным выражением, в котором такие символы, как . и ?, имеют особое значение.

files <- c("report.csv", "photo.png", "data.csv")
print(grepl(".csv", files, fixed = TRUE))
print(files[grepl(".csv", files, fixed = TRUE)])

Вывод:

[1]  TRUE FALSE  TRUE
[1] "report.csv" "data.csv"  

startsWith(x, prefix) и endsWith(x, suffix) проверяют только начало или конец каждой строки. Все эти поисковые операции чувствительны к регистру, поэтому сначала преобразуйте строки с помощью tolower(), чтобы игнорировать регистр.

names <- c("Anna", "bob", "Andre")
print(startsWith(names, "An"))
print(startsWith(tolower(names), "b"))

Вывод:

[1]  TRUE FALSE  TRUE
[1] FALSE  TRUE FALSE

Результаты являются логическими векторами, поэтому sum() подсчитывает совпадения, а any() проверяет наличие хотя бы одного:

emails <- c("a@x.com", "bad-address", "c@y.org")
valid <- grepl("@", emails, fixed = TRUE)
print(sum(valid))
print(any(!valid))

Вывод:

[1] 2
[1] TRUE

grep(pattern, x) возвращает позиции совпадающих элементов, а grep(pattern, x, value = TRUE) — сами элементы:

files <- c("a.csv", "b.txt", "c.csv")
print(grep(".csv", files, fixed = TRUE))
print(grep(".csv", files, fixed = TRUE, value = TRUE))

Результат:

[1] 1 3
[1] "a.csv" "c.csv"
challenge icon

Задание

Легко

Реализуйте count_domain(emails, domain). Верните количество адресов в emails, которые заканчиваются на @, за которым следует domain. Без учёта регистра: CY@CODDY.TECH засчитывается для домена coddy.tech.

Предоставленный код считывает адреса в виде строки, разделённой запятыми, затем домен и выводит возвращённое число.

Попробуйте сами

count_domain <- function(emails, domain) {
  # Напишите ваш код здесь
  0
}

# Предоставленный код ввода/вывода: оставьте его как есть
input <- suppressWarnings(readLines(file("stdin")))
emails <- strsplit(input[1], ",")[[1]]
cat(count_domain(emails, input[2]), sep = "\n")
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и потоки выполнения

Потренируйтесь самостоятельно: Онлайн-компилятор R