我正在尝试使用正则表达式将字符串拆分为不同的列
下面是我的数据
decodeData = [('M|C705|Exx05','2'),
('M|Exx05','4'),
('M|C705 P|Exx05','6'),
('M|C705 P|8960 L|Exx05','7'),('M|C705 P|78|8960','9')]
df = sc.parallelize(decodeData).toDF(['Decode',''])
dfNew = df.withColumn('Exx05',regexp_extract(col('Decode'), '(M|P|M)(\\|Exx05)', 1)).withColumn('C705',regexp_extract(col('Decode'), '(M|P|M)(\\|C705)', 1)) .withColumn('8960',regexp_extract(col('Decode'), '(M|P|M)(\\|8960)', 1))
dfNew.show()
Result
+--------------------+---+-----+----+-----+
| Decode| |Exx05|C705| 8960|
+--------------------+---+-----+----+-----+
| M|C705|Exx05 | 2 | | M| |
| M|Exx05 | 4 | M| | |
| M|C705 P|Exx05 | 6 | P| M| |
|M|C705 P|8960 L|Exx05| 7 | M| M| P|
| M|C705 P|78|8960 | 9 | | M| |
+--------------------+---+-----+----+-----+
在这里,我试图提取字符串exx05、c7058960的代码,这些代码可以归为m/p/l代码,例如:在解码'm | c705p | 8960l | exx05'时,我希望结果在相应的列中为l m p。然而,我在这里缺少一些逻辑,我发现很难破解
预期结果
+--------------------+---+-----+----+-----+
| Decode| |Exx05|C705| 8960|
+--------------------+---+-----+----+-----+
| M|C705|Exx05 | | M| M| |
| M|Exx05 | | M| | |
| M|C705 P|Exx05 | | P| M| |
|M|C705 P|8960 L|Exx05| | L| M| P|
| M|C705 P|78|8960 | | | M| P|
+--------------------+---+-----+----+-----+
当我尝试相应地修改reg表达式时,它适用于某些情况,而不适用于其他示例情况,这只是我正在处理的实际数据的一个子集。
例:1。exx05可以落在任何代码m/l/p中,甚至可以落在任何位置,开始、中间、结束等
一个解码只能属于每个条目/id的1个(m或l或p)代码,即m | exx05 p | 8960 l | exx05-这里exx05属于m和l,这种情况将不存在。
2条答案
按热度按时间nzrxty8p1#
您可以添加
([^ ])*
在正则表达式中对其进行扩展,使其匹配任何不被空格分隔的连续模式:dz6r00yl2#
我们用什么
X(?=Y)
也称为lookahead assertion
. 这确保我们匹配X
只有在后面跟着Y
```from pyspark.sql.functions import*
dfNew = df.withColumn('Exx05',regexp_extract(col('Decode'), '(A-Z)', 1)).withColumn('C705',regexp_extract(col('Decode'), '(A-Z)', 1)) .withColumn('8960',regexp_extract(col('Decode'), '([A-Z]+(?=|[0-9]|8960))', 1))
dfNew.show()
+--------------------+---+-----+----+----+
| Decode| t|Exx05|C705|8960|
+--------------------+---+-----+----+----+
| M|C705|Exx05| 2| | M| |
| M|Exx05| 4| M| | |
| M|C705 P|Exx05| 6| P| M| |
|M|C705 P|8960 L|E...| 7| L| M| P|
| M|C705 P|78|8960| 9| | M| P|
+--------------------+---+-----+----+----+