我正在开发一个正则表达式以应用于 PySpark DataFrame 列。
我无法在 PySpark 中重现我的工作正则表达式的结果 running here on regex101 .
我已经尝试了几种方法(见下文),但似乎都不起作用(甚至在特定的 Java 正则表达式引擎上进行了测试)。我希望获取上面示例中显示的组。
(\w+(?:\s*|\d*)\s+RUE\s.*)
[\s\-]+(\d*\s*RUE\s+.*)
代码示例:
df = spark.createDataFrame([
('RESIDENCE LA VENDEENNE 80 81 RUE LOUIS LUMIERE',)
], ["adresse1"])
df.withColumn("adresse1", regexp_replace("adresse1", "(\w+(?:\s*|\d*)\s+RUE\s.*)", '$1')).show(truncate=False)
我得到的输出是我的未更改列:
+-----------------------------------------------+
|adresse1 |
+-----------------------------------------------+
|RESIDENCE LA VENDEENNE 80 81 RUE LOUIS LUMIERE|
+-----------------------------------------------+
当我期望该列的值为
81 RUE LOUIS LUMIERE
到目前为止,我绝对没有猜测,特别是因为我之前的预测按预期工作(匹配)。
<小时/>Spark 配置:
- 版本2.4.0-cdh6.2.0
- Scala 版本 2.11.12
- OpenJDK 64 位服务器虚拟机,1.8.0_222
最佳答案
我认为你应该使用regexp_extract
而不是regexp_replace
:
from pyspark.sql.functions import regexp_extract
df.withColumn(
"adresse1",
regexp_extract("adresse1", r"(\w+(?:\s*|\d*)\s+RUE\s.*)", 1)
).show(truncate=False)
#+--------------------+
#|adresse1 |
#+--------------------+
#|81 RUE LOUIS LUMIERE|
#+--------------------+
<小时/>
要在模式不匹配时保持列值不变,可以使用 pyspark.sql.Column.rlike
和 when
:
from pyspark.sql.functions import col, when
pat = r"(\w+(?:\s*|\d*)\s+RUE\s.*)"
df.withColumn(
"adresse1",
when(
col("adresse1").rlike(pat), regexp_extract("adresse1", pat, 1)
).otherwise(col("adresse1"))
).show(truncate=False)
关于python - PySpark 正则表达式引擎不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58960838/