pyspark正则表达式全部提取
pyspark regex extract all
我有一个如下所示的数据框。
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 |
我正在尝试提取 function 或 var 之后的下一个词
我的代码在这里。
pattern3 = "(func)\s+(\w+)|(var)\s+(\w+)"
df = df.withColumn("js_extracted2", f.regexp_extract(f.col("js"),pattern3,4))
因为它只捕获一个词,所以最后一行 returns 只有 AWS 而不是 Twitter。
所以我想捕获所有匹配项。
我的spark版本不到3,
所以我尝试了df.withColumn('output', f.expr("regexp_extract_all(js, '(func)\s+(\w+)|(var)\s+(\w+)', 4)")).show()
但它 returns 所有行都是空的。
我的预期输出是
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)(\s\w+))',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)以获取更多详细信息。
我有一个如下所示的数据框。
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 |
我正在尝试提取 function 或 var 之后的下一个词
我的代码在这里。
pattern3 = "(func)\s+(\w+)|(var)\s+(\w+)"
df = df.withColumn("js_extracted2", f.regexp_extract(f.col("js"),pattern3,4))
因为它只捕获一个词,所以最后一行 returns 只有 AWS 而不是 Twitter。
所以我想捕获所有匹配项。
我的spark版本不到3,
所以我尝试了df.withColumn('output', f.expr("regexp_extract_all(js, '(func)\s+(\w+)|(var)\s+(\w+)', 4)")).show()
但它 returns 所有行都是空的。
我的预期输出是
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)(\s\w+))',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)以获取更多详细信息。