регулярное выражение: удалить нули в середине строки (но оставить их в конце) pyspark - PullRequest
0 голосов
/ 22 марта 2019

Мне нужно удалить нули, которые находятся в середине строки, сохраняя при этом нули в конце (в pyspark). До сих пор я нашел только регулярные выражения, которые удаляют начальные или конечные нули. Пример:

df1 = spark.createDataFrame(
[
    ("GH0786",),
    ("HH7040",),
    ("IP0090",),
    ("AH567",),
],
["number"]
)

ВХОД:

+-------+
|number |
+-------+
|GH0786 |
|HH7040 |
|IP0090 |
|AH567  |
+-------+

ОЖИДАЕМЫЙ ВЫХОД:

+-------+
|number |
+-------+
|GH786  |
|HH740  |
|IP90  |
|AH567  |
+-------+

Я думал о разделении строки на первый ноль и удалении последнего символа (0) первой подстроки (и если первый символ второй подстроки также начинается с нуля, то удаляет первый символ) , но было интересно, если есть более элегантный способ.

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Вы можете использовать 0+(?!$) для сопоставления нулей, которые не находятся в конце строк;?! означает отрицательный взгляд вперед, $ соответствует концу строки, поэтому (?!$) соответствует символу не в EOS:

import pyspark.sql.functions as F
df1.withColumn('zeroRemoved', F.regexp_replace('number', '0+(?!$)', '')).show()
+------+-----------+
|number|zeroRemoved|
+------+-----------+
|GH0786|      GH786|
|HH7040|      HH740|
|IP0090|       IP90|
| AH567|      AH567|
+------+-----------+
1 голос
/ 22 марта 2019

Метод regex_replace предпочтителен, но вы также можете использовать udf для этого:

from pyspark.sql.functions import col, udf
from pyspark.sql.Types import StringType

def remove_inner_zeroes(my_string):
    if my_string[-1] == '0':
        return my_string.replace('0', '') + '0'
    return my_string.replace('0', '')

remove_inner_zeros_udf = udf(remove_inner_zeros, StringType())
df1.withColumn('zeroRemoved', remove_inner_zeros_udf(col('number')).show()
#+------+-----------+
#|number|zeroRemoved|
#+------+-----------+
#|GH0786|      GH786|
#|HH7040|      HH740|
#|IP0090|       IP90|
#| AH567|      AH567|
#+------+-----------+

Или вы можете повторить ту же функцию, используя следующие функции искры:

  • pyspark.sql.Columns.endsWith()
  • pyspark.sql.functions.replace()
  • pyspark.sql.functions.when()
  • pyspark.sql.functions.concat():

Например:

from pyspark.sql.functions import col, concat, lit, replace, when

def remove_inner_zeros_spark(string_col):
    return when(
        string_col.endsWith('0'), 
        concat(replace(string_col, '0', ''), lit('0'))
    ).otherwise(replace(string_col, '0', ''))

df1.withColumn('zeroRemoved', remove_inner_zeros_spark(col('number')).show()
#+------+-----------+
#|number|zeroRemoved|
#+------+-----------+
#|GH0786|      GH786|
#|HH7040|      HH740|
#|IP0090|       IP90|
#| AH567|      AH567|
#+------+-----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...