首页 > 解决方案 > 使用 Pyspark,两个字符之间的正则表达式获取文本和数字,但不是日期

问题描述

使用 Pyspark regex_extract() 我可以在字符串中的两个字符之间进行子串化。它抓取文本和数字,但不抓取日期。

data = [('2345', '<Date>1999/12/12 10:00:05</Date>'),
('2398', '<Crew>crewIdXYZ</Crew>'),
('2328', '<Latitude>0.8252644369443788</Latitude>'),        
('3983', '<Longitude>-2.1915840465066916<Longitude>')]

df = sc.parallelize(data).toDF(['ID', 'values'])

df.show(truncate=False)

+----+-----------------------------------------+
|ID  |values                                   |
+----+-----------------------------------------+
|2345|<Date>1999/12/12 10:00:05</Date>         |
|2398|<Crew>crewIdXYZ</Crew>                   |
|2328|<Latitude>0.8252644369443788</Latitude>  |
|3983|<Longitude>-2.1915840465066916<Longitude>|
+----+-----------------------------------------+
df_2 = df.withColumn('vals', regexp_extract(col('values'), '(.)((?<=>)[^<:]+(?=:?<))', 2)) 
df_2.show(truncate=False)
+----+-----------------------------------------+-------------------+
|ID  |values                                   |vals               |
+----+-----------------------------------------+-------------------+
|2345|<Date>1999/12/12 10:00:05</Date>         |                   |
|2398|<Crew>crewIdXYZ</Crew>                   |crewIdXYZ          |
|2328|<Latitude>0.8252644369443788</Latitude>  |0.8252644369443788 |
|3983|<Longitude>-2.1915840465066916<Longitude>|-2.1915840465066916|
+----+-----------------------------------------+-------------------+

我可以在正则表达式语句中添加什么来获取日期?

标签: regexpyspark

解决方案


您可以使用

>([^<>]+)<

请参阅正则表达式演示。正则表达式匹配 a ,然后将除and之外的>任何一个或多个字符捕获到第 1 组中,然后仅匹配。ncol参数应设置为,因为您需要的值在第 1 组中<>>1

df_2 = df.withColumn('vals', regexp_extract(col('values'), '>([^<>]+)<', 1))
df_2.show(truncate=False)

+----+-----------------------------------------+-------------------+
|ID  |values                                   |vals               |
+----+-----------------------------------------+-------------------+
|2345|<Date>1999/12/12 10:00:05</Date>         |1999/12/12 10:00:05|
|2398|<Crew>crewIdXYZ</Crew>                   |crewIdXYZ          |
|2328|<Latitude>0.8252644369443788</Latitude>  |0.8252644369443788 |
|3983|<Longitude>-2.1915840465066916<Longitude>|-2.1915840465066916|
+----+-----------------------------------------+-------------------+

推荐阅读