Skip to content

regexp_replace(str, pattern, replacement)

Описание

Функция regexp_replace() заменяет все подстроки в строке str, соответствующие регулярному выражению pattern, на строку replacement. Если совпадений не найдено, возвращается исходная строка.

Параметры

  • str: string или Column - строка для поиска и замены
  • pattern: string - регулярное выражение для поиска
  • replacement: string - строка для замены найденных подстрок

Возвращаемое значение

String - строка с выполненными заменами

Пример использования

from pyspark.sql.functions import regexp_replace

# Создаем DataFrame
df = spark.createDataFrame([
    ("Hello, World!",),
    ("123-456-7890",),
    ("user@example.com",),
    ("No changes here",),
    (None,)
], ["text"])

# Заменяем различные паттерны
df.select(
    "text",
    regexp_replace("text", r"[,\s!]", "").alias("no_punctuation"),  # Удаляем знаки препинания
    regexp_replace("text", r"\d", "#").alias("masked_numbers"),     # Маскируем цифры
    regexp_replace("text", r"@.*", "@***").alias("masked_email"),   # Маскируем домен email
    regexp_replace("text", r"(\d{3})-(\d{3})-(\d{4})", "($1) $2-$3").alias("formatted_phone")  # Форматируем телефон
).show(truncate=False)

# Результат:
# +---------------+--------------+--------------+-------------+---------------+
# |text           |no_punctuation|masked_numbers|masked_email |formatted_phone|
# +---------------+--------------+--------------+-------------+---------------+
# |Hello, World!  |HelloWorld    |Hello, World! |Hello, World!|Hello, World!  |
# |123-456-7890   |123-456-7890  |###-###-####  |123-456-7890 |(123) 456-7890 |
# |user@example.com|user@example.com|user@example.com|user@***    |user@example.com|
# |No changes here|No changes here|No changes here|No changes here|No changes here|
# |null           |null          |null          |null         |null           |
# +---------------+--------------+--------------+-------------+---------------+

# Пример с очисткой текста
df = spark.createDataFrame([
    ("Price: $99.99",),
    ("Discount: 25%",),
    ("Special offer!",),
    (None,)
], ["description"])

df.select(
    "description",
    regexp_replace("description", r"[^\w\s]", "").alias("clean_text"),  # Удаляем все кроме букв, цифр и пробелов
    regexp_replace("description", r"\d+", "X").alias("masked_numbers")  # Заменяем числа на X
).show()

Примечания

  • Регулярные выражения должны быть в формате Java
  • Замена выполняется для всех совпадений в строке
  • Если совпадений не найдено, возвращается исходная строка
  • Для NULL значений возвращается NULL
  • Функция полезна для очистки и форматирования текста
  • Для извлечения подстрок по регулярному выражению используйте regexp_extract()
  • Для проверки соответствия регулярному выражению используйте rlike()
  • В строке замены можно использовать группы захвата с помощью $1, $2 и т.д.