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)