diff --git a/doc/yaml-reference.md b/doc/yaml-reference.md
index 6d066d3..920d210 100644
--- a/doc/yaml-reference.md
+++ b/doc/yaml-reference.md
@@ -250,6 +250,28 @@ aliases
       - !from_yaml .gitlab-ci.yml part2.script
 ```
 
+This example shows how to reference job names containing a `.` character.
+
+**`.gitlab-ci.yml`**
+```yaml
+image: gcc:5.1
+
+.part1:
+  script:
+    - make something
+.part2:
+  script:
+    - make something-else
+```
+
+**`scuba.yml`**
+```yaml
+image: !from_yaml .gitlab-ci.yml image
+
+aliases
+  build_part1: !from_yaml .gitlab-ci.yml "\\.part1.script"
+  build_part2: !from_yaml .gitlab-ci.yml "\\.part2.script"
+```
 
 
 [YAML]: http://yaml.org/
diff --git a/scuba/config.py b/scuba/config.py
index f78afc6..e662807 100644
--- a/scuba/config.py
+++ b/scuba/config.py
@@ -1,6 +1,7 @@
 from __future__ import print_function
 import os
 import yaml
+import re
 import shlex
 try:
     basestring
@@ -62,8 +63,9 @@ class Loader(yaml.SafeLoader):
         # Retrieve the key
         try:
             cur = doc
-            for k in key.split('.'):
-                cur = cur[k]
+            # Use a negative look-behind to split the key on non-escaped '.' characters
+            for k in re.split(r'(?<!\\)\.', key):
+                cur = cur[k.replace('\\.', '.')]  # Be sure to replace any escaped '.' characters with *just* the '.'
         except KeyError:
             raise yaml.YAMLError('Key "{}" not found in {}'.format(key, filename))
         return cur

`!from_yml` can't handle keys containing '.' characters
Due to how the "key" is parsed at [config.py](https://github.com/JonathonReinhart/scuba/blob/0244c81ec482d3c60202028bc075621447bc3ad1/scuba/config.py#L65) '.' characters must be escaped or somehow encapsulated. 
diff --git a/tests/test_config.py b/tests/test_config.py
index 26ea655..4da2d2f 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -178,6 +178,19 @@ class TestConfig(TmpDirTestCase):
         config = scuba.config.load_config('.scuba.yml')
         assert_equals(config.image, 'debian:8.2')
 
+    def test_load_config_image_from_yaml_nested_keys_with_escaped_characters(self):
+        '''load_config loads a config using !from_yaml with nested keys containing escaped '.' characters'''
+        with open('.gitlab.yml', 'w') as f:
+            f.write('.its:\n')
+            f.write('  somewhere.down:\n')
+            f.write('    here: debian:8.2\n')
+
+        with open('.scuba.yml', 'w') as f:
+            f.write('image: !from_yaml .gitlab.yml "\\.its.somewhere\\.down.here"\n')
+
+        config = scuba.config.load_config('.scuba.yml')
+        assert_equals(config.image, 'debian:8.2')
+
     def test_load_config_image_from_yaml_nested_key_missing(self):
         '''load_config raises ConfigError when !from_yaml references nonexistant key'''
         with open('.gitlab.yml', 'w') as f:

pip install -e .
parse_log_pytest
requirements.txt
nose pytest
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==3.7.1
exceptiongroup==1.2.2
iniconfig==2.1.0
nose==1.3.7
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
PyYAML==6.0.2
-e git+https://github.com/JonathonReinhart/scuba.git@0244c81ec482d3c60202028bc075621447bc3ad1#egg=scuba
tomli==2.2.1

name: scuba
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==3.7.1
      - exceptiongroup==1.2.2
      - iniconfig==2.1.0
      - nose==1.3.7
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - pyyaml==6.0.2
      - tomli==2.2.1
prefix: /opt/conda/envs/scuba

tests/test_config.py::TestConfig::test_load_config_image_from_yaml_nested_keys_with_escaped_characters
tests/test_config.py::TestCommonScriptSchema::test_script_key_list tests/test_config.py::TestCommonScriptSchema::test_script_key_mapping_invalid tests/test_config.py::TestCommonScriptSchema::test_script_key_string tests/test_config.py::TestCommonScriptSchema::test_simple tests/test_config.py::TestConfig::test_alias_entrypoint tests/test_config.py::TestConfig::test_alias_entrypoint_empty_string tests/test_config.py::TestConfig::test_alias_entrypoint_null tests/test_config.py::TestConfig::test_entrypoint_emptry_string tests/test_config.py::TestConfig::test_entrypoint_not_set tests/test_config.py::TestConfig::test_entrypoint_null tests/test_config.py::TestConfig::test_entrypoint_set tests/test_config.py::TestConfig::test_env_alias tests/test_config.py::TestConfig::test_env_top_dict tests/test_config.py::TestConfig::test_env_top_list tests/test_config.py::TestConfig::test_find_config_cur_dir tests/test_config.py::TestConfig::test_find_config_nonexist tests/test_config.py::TestConfig::test_find_config_parent_dir tests/test_config.py::TestConfig::test_find_config_way_up tests/test_config.py::TestConfig::test_hooks_invalid_list tests/test_config.py::TestConfig::test_hooks_missing_script tests/test_config.py::TestConfig::test_hooks_mixed tests/test_config.py::TestConfig::test_load_config__no_spaces_in_aliases tests/test_config.py::TestConfig::test_load_config_empty tests/test_config.py::TestConfig::test_load_config_image_from_yaml tests/test_config.py::TestConfig::test_load_config_image_from_yaml_missing_arg tests/test_config.py::TestConfig::test_load_config_image_from_yaml_missing_file tests/test_config.py::TestConfig::test_load_config_image_from_yaml_nested_key_missing tests/test_config.py::TestConfig::test_load_config_image_from_yaml_nested_keys tests/test_config.py::TestConfig::test_load_config_image_from_yaml_unicode_args tests/test_config.py::TestConfig::test_load_config_minimal tests/test_config.py::TestConfig::test_load_config_safe tests/test_config.py::TestConfig::test_load_config_safe_external tests/test_config.py::TestConfig::test_load_config_with_aliases tests/test_config.py::TestConfig::test_load_unexpected_node tests/test_config.py::TestConfig::test_process_command_alias_overrides_image tests/test_config.py::TestConfig::test_process_command_alias_overrides_image_and_empty_entrypoint tests/test_config.py::TestConfig::test_process_command_alias_overrides_image_and_entrypoint tests/test_config.py::TestConfig::test_process_command_aliases_unused tests/test_config.py::TestConfig::test_process_command_aliases_used_noargs tests/test_config.py::TestConfig::test_process_command_aliases_used_withargs tests/test_config.py::TestConfig::test_process_command_empty tests/test_config.py::TestConfig::test_process_command_image tests/test_config.py::TestConfig::test_process_command_multiline_aliases_forbid_user_args tests/test_config.py::TestConfig::test_process_command_multiline_aliases_used tests/test_config.py::TestConfig::test_process_command_no_aliases
scuba/config.py doc/yaml-reference.md
scuba/config.py doc/yaml-reference.md