代码之家  ›  专栏  ›  技术社区  ›  user3407267

如何替换仅出现在某物之间的分隔符

  •  0
  • user3407267  · 技术社区  · 4 年前

    我有一个关于这些数据的用例:

    1. "apple+case"
    2. "apple+case+10+cover"
    3. "apple+case+10++cover"
    4. "+apple"
    5. "iphone8+"
    

    目前,我这样做是为了用空格替换+,如下所示:

    def normalizer(value: String): String = {
        if (value == null) {
          null
        } else {
           value.replaceAll("\\+", BLANK_SPACE)        
         }
      }
    
      val testUDF = udf(normalizer(_: String): String)
    
      df.withColumn("newCol",  testUDF($"value"))
    

    但这取代了所有的“+”。如何替换字符串之间的“+”,同时处理以下用例:“apple+case+10++cover”=>“苹果盒子10+盖子”?

    The output should be
    1. "apple case"
    2. "apple case 10 cover"
    3. "apple case 10+ cover"
    4. "apple"
    5. "iphone8+"
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Shaido Aman    4 年前

    您可以使用 regexp_replace 这样做而不是使用udf,应该会快得多。在大多数情况下,你可以在正则表达式中使用负前瞻,但对于“+apple”,你实际上想用“”(而不是空格)替换“+”。最简单的方法是简单地使用regexps。

    df.withColumn("newCol", regexp_replace($"value", "^\\+", ""))
      .withColumn("newCol", regexp_replace($"newCol", "\\+(?!\\+|$)", " "))
    

    这将带来:

    +--------------------+--------------------+
    |value               |newCol              |
    +--------------------+--------------------+
    |apple+case          |apple case          |
    |apple+case+10+cover |apple case 10 cover |
    |apple+case+10++cover|apple case 10+ cover|
    |+apple              |apple               |
    |iphone8+            |iphone8+            |
    +--------------------+--------------------+
    

    为了使其更加模块化和可重用,您可以将其定义为函数:

    def normalizer(c: String) = regexp_replace(regexp_replace(col(c), "^\\+", ""), "\\+(?!\\+|$)", " ")
    
    df.withColumn("newCol", normalizer("value"))
    
        2
  •  0
  •   Tim Biegeleisen    4 年前

    您可以尝试进行两次正则表达式替换:

    df.withColumn("newCol", regexp_replace(
        regexp_replace(testUDF("value"), "(?<=\d)\+(?!\+)", "+ "),
        "(?<!\d)\+", " ")).show
    

    内部正则表达式替换将针对前面有一个数字的单加号的边缘情况,应该通过添加空格来替换(但不要删除加号)。例子:

    apple+case+10+cover  -->  apple+case+10+ cover
    

    然后,外部正则表达式替换会针对所有前面没有数字的加号,并将其替换为空格。示例,从上面继续:

    apple+case+10+ cover -->  apple case 10+ cover