pyspark正则表达式提取所有



我有一个如下的数据帧。

id  | js                                    |
0   | bla var test bla ..                   |
1   | bla function RAM blob                 |
2   | function CPU blob blob                |
3   | thanks                                |
4   | bla var AWS and function twitter blaa |

我正在尝试提取函数或var 之后的下一个单词

我的代码在这里。

pattern3 = "(func)s+(w+)|(var)s+(w+)"
df = df.withColumn("js_extracted2", f.regexp_extract(f.col("js"),pattern3,4))

由于只捕获一个单词,最后一行只返回AWS而不返回Twitter。

所以我想捕捉所有匹配。

我的spark版本不到3,

所以我尝试了df.withColumn('output', f.expr("regexp_extract_all(js, '(func)s+(w+)|(var)s+(w+)', 4)")).show()

但它只对所有行返回空。

我的预期输出是

id  | js                                    | output
0   | bla var test bla ..                   | [test]
1   | bla function RAM blob                 | [RAM]
2   | function CPU blob blob                | [CPU]
3   | thanks                                | 
4   | bla var AWS and function twitter blaa | [AWS, twitter]

您需要使用四个来形成一个正则表达式。

df = df.withColumn("js_extracted2", F.expr(f"regexp_extract_all(js, '(function|var)\\s+(\\w+)', 2)"))
df.show(truncate=False)

(?<=i)j认证背后使用积极的眼光。也就是说,仅当i立即位于其左侧时提取j

df.withColumn('name', regexp_extract('js', '((?<=function|var)(sw+))',1)).show()
---+--------------------+-----+
| id|                  js| name|
+---+--------------------+-----+
|  0| bla var test bla ..| test|
|  1| bla function RAM...|  RAM|
|  2|function CPU blob...|  CPU|
|  3|             thanks |     |
|  4|bla var AWS and f...|  AWS|
+---+--------------------+-----+

这个问题看起来更像如何在不使用regexp_extract_all的情况下做到这一点。

这里有另一种不使用正则表达式的方法,只是为了防止出现使用regexp_extract_all:的问题

noofwordstoextract = 1
df.withColumn("ArrayOfWords",F.split("js"," "))
.withColumn("test",F.expr(f"""filter(transform(ArrayOfWords,(x,e)-> 
CASE WHEN x in ('var','function') 
THEN array_join(slice(ArrayOfWords,e+2,{noofwordstoextract}),' ') ELSE NULL END)
,y-> y is not NULL)""")).drop("ArrayOfWords").show()

+---+-------------------------------------+--------------+
|id |js                                   |test          |
+---+-------------------------------------+--------------+
|0  |bla var test bla ..                  |[test]        |
|1  |bla function RAM blob                |[RAM]         |
|2  |function CPU blob blob               |[CPU]         |
|3  |thanks                               |[]            |
|4  |bla var AWS and function twitter blaa|[AWS, twitter]|
+---+-------------------------------------+--------------+

此解决方案将字符串拆分为一个数组,然后检查当前元素是否在"var"或"function"中,然后提取接下来的n个单词(此处为1(,然后将它们连接以形成原始字符串(尝试使用noofwordstoextract=2(以获取更多详细信息。

最新更新