diff --git a/tests/formats/dataclass/test_filters.py b/tests/formats/dataclass/test_filters.py
index 7fd222b50..aa095d301 100644
--- a/tests/formats/dataclass/test_filters.py
+++ b/tests/formats/dataclass/test_filters.py
@@ -111,6 +111,12 @@ def test_constant_value(self):
attr = AttrFactory.create(types=[AttrTypeFactory.create(alias="alias")])
self.assertEqual("Alias", self.filters.constant_value(attr))
+ def test_apply_substitutions_with_regexes(self):
+ self.filters.substitutions[ObjectType.CLASS]["(.*)Class"] = "\\1Type"
+
+ actual = self.filters.apply_substitutions("FooClass", ObjectType.CLASS)
+ self.assertEqual("FooType", actual)
+
@mock.patch.object(Filters, "field_default_value")
def test_field_definition(self, mock_field_default_value):
mock_field_default_value.side_effect = [1, False]
diff --git a/tests/models/test_config.py b/tests/models/test_config.py
index e046e4447..cbf737a81 100644
--- a/tests/models/test_config.py
+++ b/tests/models/test_config.py
@@ -58,7 +58,7 @@ def test_create(self):
' \n'
' \n'
' \n'
- ' \n'
+ ' \n'
" \n"
"\n"
)
diff --git a/xsdata/formats/dataclass/filters.py b/xsdata/formats/dataclass/filters.py
index cb19f6ce8..c5c6fed77 100644
--- a/xsdata/formats/dataclass/filters.py
+++ b/xsdata/formats/dataclass/filters.py
@@ -147,7 +147,7 @@ def class_name(self, name: str) -> str:
def apply_substitutions(self, name: str, obj_type: ObjectType) -> str:
for search, replace in self.substitutions[obj_type].items():
- name = re.sub(search, replace, name)
+ name = re.sub(rf"{search}", rf"{replace}", name)
return name
diff --git a/xsdata/models/config.py b/xsdata/models/config.py
index bf085abed..9777f1132 100644
--- a/xsdata/models/config.py
+++ b/xsdata/models/config.py
@@ -443,7 +443,9 @@ def create(cls) -> "GeneratorConfig":
)
obj.substitutions.substitution.append(
- GeneratorSubstitution(type=ObjectType.CLASS, search="Class", replace="Type")
+ GeneratorSubstitution(
+ type=ObjectType.CLASS, search="(.*)Class$", replace="\\1Type"
+ )
)
return obj