Python PySpark正则表达式引擎不匹配

Python PySpark正则表达式引擎不匹配,python,regex,apache-spark,pyspark,Python,Regex,Apache Spark,Pyspark,我正在编写一个正则表达式,用于PySpark数据帧列 我不能碰巧在PySpark中复制我的正则表达式的结果 我尝试了几种方法(见下文),但似乎没有一种有效(甚至在特定的JavaRegex引擎上进行了测试)。我希望获取上面示例中显示的组 (\w+(?:\s*|\d*)\s+RUE\s.*) [\s\-]+(\d*\s*RUE\s+.*) 代码示例: df = spark.createDataFrame([ ('RESIDENCE LA VENDEENNE 80 81 RUE LOUIS

我正在编写一个正则表达式,用于PySpark数据帧列

我不能碰巧在PySpark中复制我的正则表达式的结果

我尝试了几种方法(见下文),但似乎没有一种有效(甚至在特定的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
到目前为止,我完全没有猜测,尤其是因为我之前的工作(匹配)如预期


Spark配置:

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

我认为您应该使用,而不是:


若要在模式不匹配时保持列值不变,可以使用和:


请注意,您可以将您的模式简化为
\w+\d*\s+RUE\s.*
确实我替换了它,谢谢!好的,它完全有效,谢谢你指出这一点。在API文档上走得太快,把它们两个搞错了。当我继续讨论这个主题@pault时,我脑海中出现了一个问题,如果正则表达式不匹配,我如何防止行值被空值覆盖?我是否必须使用第三列存储正则表达式摘录,然后仅在正则表达式的输出不是空的情况下替换原始列的内容?是的,类似于这样。另一个选择是使用
rlike
首先测试列是否与模式匹配——我已经发布了一个更新。这让我感觉更加直观易读(至少对我来说)。再次感谢您的快速回答。我正在测试它。它对物理模式有很大影响吗?对我来说,我的看起来一点也不像,但看起来确实花了很多时间。尽管仍然使用本机PySpark函数。
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)