Scala - Объяснение для регулярного выражения
Предполагая, что у меня есть датафрейм с именем df и regex, как показано ниже:
var df2 = df
regex = new Regex("_(.)")
for (col <- df.columns) {
df2 = df2.withColumnRenamed(col, regex.replaceAllIn(col, { M => M.group(1).toUpperCase }))
}
Я знаю, что этот код переименовывает столбцы df2 так, что если бы у меня было имя столбца с именем "user_id", он стал бы userId.
Я понимаю, что делают функции colcolRenamed и replaceAllIn. Что я не понимаю, так это часть: { M => M.group(1).toUpperCase }
Что такое М? Что такое группа (1)?
Я могу догадаться, что происходит, потому что я знаю, что ожидаемый результат - userId, но я не думаю, что полностью понимаю, как это происходит.
Может ли кто-нибудь помочь мне понять это? Был бы очень признателен.
Спасибо!
2 ответа
Подпись replaceAllIn
метод
replaceAllIn(target: CharSequence, replacer: (Match) ⇒ String): String
Чтобы M
это Match
и у него есть group
метод, который возвращает
Соответствующая строка в группе i или ноль, если ничего не найдено
Группа в регулярных выражениях - это то, что соответствует (под) регулярному выражению в скобках (.
т. е. один символ в вашем случае). У вас может быть несколько групп захвата, и вы можете назвать их или ссылаться на них по индексу. Подробнее о захвате групп можно прочитать здесь и в документации по Scala API для Regex
,
Так { M => M.group(1).toUpperCase }
означает, что вы заменяете каждое совпадение символом в нем, который идет после _
изменилось на верхний регистр
M
просто означает совпадение, а группа (1) относится к группе (1), захваченной регулярным выражением. Рассмотрим этот пример:
Кубок мира
если вы хотите сопоставить приведенный выше пример с регулярным выражением, вы напишите что-то вроде этого \w+\s\w+
однако вы можете использовать группы и записать их следующим образом:
(\w+)\s(\w+)
Скобки в Regex используются для обозначенных групп. В приведенном выше примере первый (\w+)
это группа 1, которая будет соответствовать World
, Второй (\w+)
будет соответствовать группе 2 в регулярном выражении, которое Cup
, Если вы хотите соответствовать целиком, вы можете использовать группу 0, которая будет соответствовать целиком.
Смотрите группы в действии здесь на правой стороне: https://regex101.com/r/v0Ybsv/1