我试图获得一些关于pyspark中regexp\u extract的见解,并尝试使用此选项进行检查以获得更好的理解。
下面是我的Dataframe
data = [('2345', 'Checked|by John|for kamal'),
('2398', 'Checked|by John|for kamal '),
('2328', 'Verified|by Srinivas|for kamal than some random text'),
('3983', 'Verified|for Stacy|by John')]
df = sc.parallelize(data).toDF(['ID', 'Notes'])
df.show()
+----+-----------------------------------------------------+
| ID| Notes |
+----+-----------------------------------------------------+
|2345|Checked|by John|for kamal |
|2398|Checked|by John|for kamal |
|2328|Verified|by Srinivas|for kamal than some random text |
|3983|Verified|for Stacy|by John |
+----+-----------------------------------------------------+
所以在这里我试图确定一个身份证是由约翰检查还是验证的
在so成员的帮助下,我破解了regexp\u提取物的用法,并得出了以下解决方案
result = df.withColumn('Employee', regexp_extract(col('Notes'), '(Checked|Verified)(\\|by John)', 1))
result.show()
+----+------------------------------------------------+------------+
| ID| Notes |Employee|
+----+------------------------------------------------+------------+
|2345|Checked|by John|for kamal | Checked|
|2398|Checked|by John|for kamal | Checked|
|2328|Verified|by Srinivas|for kamal than some random text| |
|3983|Verified|for Stacy|by John | |
+----+--------------------+----------------------------------------+
对于少数的身份证,这给了我完美的结果,但最后一个身份证,它没有打印验证。有人能告诉我是否需要在所提到的正则表达式中执行任何其他操作吗?
我的感觉是 (Checked|Verified)(\\|by John)
仅匹配相邻值。我试过*和$,但还是没有打印身份证号3983。
3条答案
按热度按时间slwdgvem1#
我会用正则表达式来表达:
演示
这种模式
Checked/Verified
然后by John
两者之间用任意数量的文字隔开。请注意,这里我只使用单词边界,而不是管道。更新代码:
ifmq2ha22#
你可以试试这个正则表达式:
j8ag8udp3#
另一种方法是检查列注解是否包含字符串
by John
: