From 58dd1d27561d62a533ad72c4953bd5d5e49e525d Mon Sep 17 00:00:00 2001 From: Cameron <96146940+camriddell@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:05:18 -0800 Subject: [PATCH] feat: duckdb replace_all with regex (#1784) --- narwhals/_duckdb/expr.py | 13 +++++++++++-- tests/expr_and_series/str/replace_test.py | 3 --- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/narwhals/_duckdb/expr.py b/narwhals/_duckdb/expr.py index cfd2efdac..7285200f8 100644 --- a/narwhals/_duckdb/expr.py +++ b/narwhals/_duckdb/expr.py @@ -675,8 +675,17 @@ def replace_all( from duckdb import FunctionExpression if literal is False: - msg = "`replace_all` for DuckDB currently only supports `literal=True`." - raise NotImplementedError(msg) + return self._compliant_expr._from_call( + lambda _input: FunctionExpression( + "regexp_replace", + _input, + ConstantExpression(pattern), + ConstantExpression(value), + ConstantExpression("g"), + ), + "replace_all", + returns_scalar=self._compliant_expr._returns_scalar, + ) return self._compliant_expr._from_call( lambda _input: FunctionExpression( "replace", _input, ConstantExpression(pattern), ConstantExpression(value) diff --git a/tests/expr_and_series/str/replace_test.py b/tests/expr_and_series/str/replace_test.py index 4d6da63de..68adf26e7 100644 --- a/tests/expr_and_series/str/replace_test.py +++ b/tests/expr_and_series/str/replace_test.py @@ -116,15 +116,12 @@ def test_str_replace_expr( ) def test_str_replace_all_expr( constructor: Constructor, - request: pytest.FixtureRequest, data: dict[str, list[str]], pattern: str, value: str, literal: bool, # noqa: FBT001 expected: dict[str, list[str]], ) -> None: - if "duckdb" in str(constructor) and literal is False: - request.applymarker(pytest.mark.xfail) df = nw.from_native(constructor(data)) result = df.select( nw.col("a").str.replace_all(pattern=pattern, value=value, literal=literal)