diff --git a/sphinx/builders/html/transforms.py b/sphinx/builders/html/transforms.py
index ea596cb4b22..1ba6ba85743 100644
--- a/sphinx/builders/html/transforms.py
+++ b/sphinx/builders/html/transforms.py
@@ -40,7 +40,9 @@ class KeyboardTransform(SphinxPostTransform):
def run(self, **kwargs: Any) -> None:
matcher = NodeMatcher(nodes.literal, classes=["kbd"])
- for node in self.document.findall(matcher): # type: nodes.literal
+ # this list must be pre-created as during iteration new nodes
+ # are added which match the condition in the NodeMatcher.
+ for node in list(self.document.findall(matcher)): # type: nodes.literal
parts = self.pattern.split(node[-1].astext())
if len(parts) == 1 or self.is_multiwords_key(parts):
continue
diff --git a/tests/roots/test-transforms-post_transforms-keyboard/conf.py b/tests/roots/test-transforms-post_transforms-keyboard/conf.py
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/tests/roots/test-transforms-post_transforms-keyboard/index.rst b/tests/roots/test-transforms-post_transforms-keyboard/index.rst
new file mode 100644
index 00000000000..21775782f64
--- /dev/null
+++ b/tests/roots/test-transforms-post_transforms-keyboard/index.rst
@@ -0,0 +1,4 @@
+Regression test for issue 10495
+===============================
+
+:kbd:`spanish - inquisition`
diff --git a/tests/test_transforms_post_transforms.py b/tests/test_transforms_post_transforms.py
index 272d83e3a02..215e6d14fe2 100644
--- a/tests/test_transforms_post_transforms.py
+++ b/tests/test_transforms_post_transforms.py
@@ -48,3 +48,12 @@ def missing_reference(app, env, node, contnode):
content = (app.outdir / 'index.html').read_text(encoding='utf8')
assert 'Age' in content
+
+
+@pytest.mark.sphinx('html', testroot='transforms-post_transforms-keyboard',
+ freshenv=True)
+def test_keyboard_hyphen_spaces(app):
+ """Regression test for issue 10495, we want no crash."""
+ app.build()
+ assert "spanish" in (app.outdir / 'index.html').read_text(encoding='utf8')
+ assert "inquisition" in (app.outdir / 'index.html').read_text(encoding='utf8')