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 解释的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 删除数据框列中的多个字符

pyspark用正则表达式替换正则表达式

Pyspark 数据框:访问列(TypeError:列不可迭代)

在 PySpark 中提取多个正则表达式匹配项

在pyspark中将字符串价格值转换为double类型

Pyspark - 用不同的字符替换字符串的一部分(字符数不均匀)