sql—在字符串中查找特定字符的正则表达式

odopli94  于 2021-05-27  发布在  Spark
关注(0)|答案(4)|浏览(759)

我有这些样本值

  1. prm_2020 P02 United Kingdom London 2 for 2
  2. prm_2020 P2 United Kingdom London 2 for 2
  3. prm_2020 P10 United Kingdom London 2 for 2
  4. prm_2020 P11 United Kingdom London 2 for 2

需要像这样找到p2,p02,p11,p06,p05,尝试在databricks中使用regexp\u extract函数。努力寻找正确的表达方式。一旦我从字符串中找到p10,p6,我需要把数字放在名为id的新列中

  1. select distinct
  2. promo_name
  3. ,regexp_extract(promo_name, '(?<=p\d+\s+)P\d+') as regexp_id
  4. from stock
  5. where promo_name is not null
  6. select distinct
  7. promo_name
  8. ,regexp_extract(promo_name, 'P[0-9]+') as regexp_id
  9. from stock
  10. where promo_name is not null

两者都会产生错误

f5emj3cl

f5emj3cl1#

功能 regexp_extract 需要3个参数。
列值
正则表达式模式
组索引

  1. def regexp_extract(e: org.apache.spark.sql.Column,exp: String,groupIdx: Int): org.apache.spark.sql.Column

中缺少最后一个参数 regexp_extract 功能。
检查以下代码。

  1. scala> df.show(truncate=False)
  2. +------------------------------------------+
  3. |data |
  4. +------------------------------------------+
  5. |prm_2020 P02 United Kingdom London 2 for 2|
  6. |prm_2020 P2 United Kingdom London 2 for 2 |
  7. |prm_2020 P10 United Kingdom London 2 for 2|
  8. |prm_2020 P11 United Kingdom London 2 for 2|
  9. +------------------------------------------+
  1. df
  2. .withColumn("parsed_data",regexp_extract(col("data"),"(P[0-9]*)",0))
  3. .show(truncate=False)
  4. +------------------------------------------+-----------+
  5. |data |parsed_data|
  6. +------------------------------------------+-----------+
  7. |prm_2020 P02 United Kingdom London 2 for 2|P02 |
  8. |prm_2020 P2 United Kingdom London 2 for 2 |P2 |
  9. |prm_2020 P10 United Kingdom London 2 for 2|P10 |
  10. |prm_2020 P11 United Kingdom London 2 for 2|P11 |
  11. +------------------------------------------+-----------+
  1. df.createTempView("tbl")
  2. spark
  3. .sql("select data,regexp_extract(data,'(P[0-9]*)',0) as parsed_data from tbl")
  4. .show(truncate=False)
  5. +------------------------------------------+-----------+
  6. |data |parsed_data|
  7. +------------------------------------------+-----------+
  8. |prm_2020 P02 United Kingdom London 2 for 2|P02 |
  9. |prm_2020 P2 United Kingdom London 2 for 2 |P2 |
  10. |prm_2020 P10 United Kingdom London 2 for 2|P10 |
  11. |prm_2020 P11 United Kingdom London 2 for 2|P11 |
  12. +------------------------------------------+-----------+
展开查看全部
cmssoen2

cmssoen22#

一个正则表达式可能是 (?<=prm_\d+\s+)P\d+ 除了搜索p形式的字符串,其中是数字,它还检查这些字符串前面是否有prm\形式的字符串,其中*是数字。
请记住区分大小写。上面的解决方案是区分大小写的(如果您的输入是prm,那么您的匹配将被丢弃)。我不熟悉apachespark,但是我假设它支持参数,例如/i,因为其他平台表明regex应该是不区分大小写的。
regexr.com演示

oyt4ldly

oyt4ldly3#

表达式为:

  1. select regexp_extract(col, 'P[0-9]+')
qyyhg6bp

qyyhg6bp4#

只需选择组0

  1. regexp_extract(promo_name, 'P[0-9]+',0)

相关问题