我最近开始学习PySpark,我正在try 了解如何返回正则表达式模式在列中的位置,但如果列中不存在正则表达式模式,则返回0.

我在StackOverflow上try 了另一个非常好的答案,它在返回另一个字符串中正则表达式模式开始的位置方面做得很好.https://stackoverflow.com/questions/66121409/locate-function-with-regular-expression-in-spark-sql然而,在这个答案中,当正则表达式模式不存在于字符串中时,它返回1而不是我需要的0.

根据另一个答案,我试着把它改编如下:

spark.sql("select locate(regexp_extract('0000X00', '([X,Y,Z,W])', 1),  '0000X00') as check_pos_string").show()

+----------------+
|check_pos_string|
+----------------+
|               5|
+----------------+

不出所料,它返回位置5,这是正则表达式模式中的字符X出现在它正在判断的字符串中的位置.

但是,当我try 执行以下操作时,即使该模式不存在于它正在判断的字符串中,它也会返回1.

spark.sql("select locate(regexp_extract('0000000', '([X,Y,Z,W])', 1),  '0000000') as check_pos_string").show()

+----------------+
|check_pos_string|
+----------------+
|               1|
+----------------+

我想知道如果字符串中不存在正则表达式模式,如何返回0,而不是返回1,如下所示.

+----------------+
|check_pos_string|
+----------------+
|               0|
+----------------+

我有一种感觉,因为我缺乏使用PySpark的经验,所以我误解了一些简单的东西!

推荐答案

以下是几个一般性的要点:

  • [X,Y,Z,W]是一个character class,它匹配方括号之间的所有字符,这意味着它匹配X,Y,Z,W(注意,它也匹配逗号).你真正想要的是[XYZW]或更简明的[W-Z].
  • 您的表达式中不需要capture group (...);如果没有,只需将group参数更改为0即可.

所以你拨打regexp_extract的电话应该是这样的:

regexp_extract('0000X00', '[XYZW]', 0)

就您的问题而言,这是因为regexp_extract在空字符串不匹配时返回一个空字符串,而locate在输入的开头"找到"该字符串,因此返回1作为结果.

您可以通过将匹配的字符与通常不会出现在字符串中的字符进行replacing匹配,然后try 将该字符设置为locate来解决此问题.

spark.sql("select locate('*', regexp_replace('0000X0Y', '[W-Z]', '*')) as check_pos_string").show()

输出:

check_pos_string
5

如果未找到匹配项,则不会将特殊字符替换为字符串,因此locate将返回0:

spark.sql("select locate('*', regexp_replace('0000000', '[W-Z]', '*')) as check_pos_string").show()

输出:

check_pos_string
0

Python相关问答推荐

计算每月过go x年的平均值

如果我已经使用了time,如何要求Python在12秒后执行另一个操作.sleep

如何将桌子刮成带有Se的筷子/要求/Beautiful Soup ?

Python plt.text中重叠,包adjust_text不起作用,如何修复?

剧作家Python:expect(locator).to_be_visible()vs locator.wait_for()

如何计算列表列行之间的公共元素

在Pandas 日历中插入一行

韦尔福德方差与Numpy方差不同

将jit与numpy linSpace函数一起使用时出错

如何标记Spacy中不包含特定符号的单词?

对于一个给定的数字,找出一个整数的最小和最大可能的和

Telethon加入私有频道

numpy卷积与有效

pyscript中的压痕问题

如何从数据库上传数据到html?

在含噪声的3D点网格中识别4连通点模式

调用decorator返回原始函数的输出

计算空值

比Pandas 更好的 Select

根据客户端是否正在传输响应来更改基于Flask的API的行为