PySpark 的 Regexp_replace 解释
Posted
技术标签:
【中文标题】PySpark 的 Regexp_replace 解释【英文标题】:Regexp_replace explanation for PySpark 【发布时间】:2021-10-14 21:13:06 【问题描述】:我查看了文档:https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.functions.regexp_replace.html
但我一生都无法弄清楚为什么这部分
r'(\d+)'
导致改变
'100-200'
到
'-----'
谁有这方面的好文档?我相信 \d 部分寻找 0-9 但这就是我所得到的。我也不明白你需要按什么顺序做什么。
【问题讨论】:
这里不是“\d”而是“(\d+)”,意思是0-9组,不是个位数。 IE。整数“100000”将替换为“--”。 谢谢帕夏。 'r' 呢?那是干什么用的? 我不熟悉Python;也许,这是正则表达式的标记。 【参考方案1】:\d
匹配一个数字,即0-9
和+
匹配前一个令牌一次到无限次,尽可能多次,根据需要回馈。
列的值是 100-200。根据上述声明,正则表达式匹配 100 个(\d
将分别匹配 100 的每个数字,但 +
完全匹配 100)。所以 100 将被 --.
替换 以同样的方式 200 将被 --.
替换 最后我们将 -----
作为列值。
方括号用于如果我们想分组以便稍后使用从 1 开始的索引来捕获。 假设我们只想提取列中的第一个匹配值,然后在 spark 中我们可以使用 regexp_extract,如下所示:
df.select(regexp_extract('column', '(\d+)', 1)) # 1 is groupIndex
在python Prefix r 中使用在正则表达式之前,它标记原始字符串。例如,'\n' 是一个新行,而 r'\n'
表示两个字符:反斜杠 \ 后跟 n。
如果你想匹配 "\n" 并且你不使用 r 前缀,那么你必须在你的正则表达式中像 "\\n"
这样转义 \。
您可以在此website 中练习/测试正则表达式,您将实时了解后台发生的情况。你可以通过这个简单的cheatsheet。
【讨论】:
谢谢莫哈娜。您说“+ 匹配前一个标记一次到无限次”,那么括号呢?当你做'+'时你需要包括它吗?另外,谢谢你的链接:) 除非您想分组,否则不需要括号。假设您只想要 100-200 中的前 100 个,那么您可以使用正则表达式 (\d)+ 中的括号进行分组。现在您可以使用从 1 开始的索引来访问组值。 spark 示例:regexp_extract('column', '(\d+)', 1) --> 这将输出为 100。以上是关于PySpark 的 Regexp_replace 解释的主要内容,如果未能解决你的问题,请参考以下文章