假设我有一个名为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。
我理解withcolumnRenamed和replaceAllIn函数的作用。我不明白的是这一部分:{ M => M.group(1).toUpperCase }
什么是M?什么是组(1)?
我可以猜到发生了什么,因为我知道预期的输出是userId,但我不认为我完全理解这是怎么回事。
有人可以帮我理解吗?真的很感激。
谢谢!
答案 0 :(得分:0)
replaceAllIn
方法的签名是
replaceAllIn(target: CharSequence, replacer: (Match) ⇒ String): String
组i中匹配的字符串,如果没有匹配则为null
正则表达式中的组与括号中的(子)正则表达式匹配(.
,即您的情况下为一个符号)。您可以拥有多个捕获组,您可以命名它们或通过索引引用它们。您可以阅读有关捕获组here以及Regex
的Scala API文档的更多信息。
所以{ M => M.group(1).toUpperCase }
表示您将每个匹配替换为_
更改为大写后的符号。
答案 1 :(得分:0)
M
仅表示匹配,组(1)表示由正则表达式捕获的组(1)。考虑这个例子:
世界杯
如果你想将上面的例子与正则表达式匹配,你会写这样的\w+\s\w+
,但是,你可以使用这些组,并用这种方式写出来:
(\w+)\s(\w+)
Regex中的括号用于表示组。在上面的示例中,第一个(\w+)
是第1组,它将匹配World
。第二个(\w+)
将匹配正则表达式Cup
中的第2组。如果你想匹配整个事物,你可以使用匹配整个事物的组0。
请参阅右侧的群组: https://regex101.com/r/v0Ybsv/1