python - PySpark 正则表达式引擎不匹配

标签 python regex apache-spark pyspark

我正在开发一个正则表达式以应用于 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.rlikewhen :

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/

相关文章:

python - 从文本中提取标题

python - 计算按日期和标签分组的行中列表元素的频率

python - 从 Python 中的日期字符串中删除时间戳

python - 因为我可以在 exp reg 中格式化一个句子?

python - 在Python中使用正则表达式匹配字符串中重复出现的单词

python - Pyspark count() 和 collect() 不起作用

python - 无法从 CreateView 重定向

hadoop - Spark ml 模型保存到 hdfs

web-services - 并行运行 EMR 的步骤

python - 使用正则表达式在文本文件中间隔单词