Pypark正则表达式引擎不匹配

2024-06-02 05:41:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个正则表达式来应用于PySpark数据帧列。你知道吗

我不能碰巧在PySpark中复制我的工作regexrunning here on regex101的结果。你知道吗

我尝试了几种方法(见下文),但似乎没有一种有效(甚至在特定的JavaRegex引擎上进行了测试)。我想把上面例子中的那一组拿来。你知道吗

(\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

到目前为止,我完全没有猜测,特别是我以前的工作(匹配)预测。你知道吗


火花配置:

  • 版本2.4.0-cdh6.2.0
  • Scala版本2.11.12
  • OpenJDK 64位服务器虚拟机,1.8.0Þ

Tags: 数据版本dfhereonlapysparklouis
1条回答
网友
1楼 · 发布于 2024-06-02 05:41:00

我认为应该使用^{}而不是^{}

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|
#+          +

要在模式不匹配时保持列值不变,可以使用^{}^{}

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)

相关问题 更多 >