diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index b42ae4a..86f2842 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,6 +1,12 @@
 Changelog
 ---------
 
+0.5.2 (unreleased)
+++++++++++++++++++
+
+* BottlePlugin: Fix support for typed path arguments (:issue:`16`).
+  Thanks :user:`genbits` for reporting and thanks :user:`elfjes` for the fix.
+
 0.5.1 (2019-11-18)
 ++++++++++++++++++
 
diff --git a/src/apispec_webframeworks/bottle.py b/src/apispec_webframeworks/bottle.py
index 4ed5327..b1bbbcf 100644
--- a/src/apispec_webframeworks/bottle.py
+++ b/src/apispec_webframeworks/bottle.py
@@ -27,8 +27,8 @@ from bottle import default_app
 from apispec import BasePlugin, yaml_utils
 from apispec.exceptions import APISpecError
 
+RE_URL = re.compile(r"<([^<>:]+):?[^>]*>")
 
-RE_URL = re.compile(r"<(?:[^:<>]+:)?([^<>]+)>")
 
 _default_app = default_app()
 

Bottle plugin path regex bug when using argument type in the url
<a href="https://github.com/genbits"><img src="https://avatars0.githubusercontent.com/u/3424362?v=4" align="left" width="96" height="96" hspace="10"></img></a> **Issue by [genbits](https://github.com/genbits)**
_Monday May 21, 2018 at 10:56 GMT_
_Originally opened as https://github.com/marshmallow-code/apispec/issues/215_

----

When parsing the path of a bottle app in the form: `/path/to/<resourceId:int>`, the generated API path becomes `/path/to/{int}`.

reproduce:

    import re
    RE_URL = re.compile(r'<(?:[^:<>]+:)?([^<>]+)>')
    path = '/path/to/<resourceId:int>'
    RE_URL.sub(r'{\1}', path)  # --> '/path/to/{int}'

This can be fixed easily by replacing RE_URL with: `re.compile(r'<([^:]+)(?::.+)?>')`


diff --git a/src/apispec_webframeworks/tests/test_ext_bottle.py b/src/apispec_webframeworks/tests/test_ext_bottle.py
index bbaf116..47c168a 100644
--- a/src/apispec_webframeworks/tests/test_ext_bottle.py
+++ b/src/apispec_webframeworks/tests/test_ext_bottle.py
@@ -99,10 +99,13 @@ class TestPathHelpers:
         spec.path(view=get_pet)
         assert "/pet/{pet_id}" in get_paths(spec)
 
-    def test_path_with_params(self, spec):
-        @route("/pet/<pet_id>/<shop_id>", methods=["POST"])
-        def set_pet():
-            return "new pet!"
+    @pytest.mark.parametrize(
+        "path", ["/pet/<pet_id:int>/<shop_id:re:[a-z]+>", "/pet/<pet_id>/<shop_id>"],
+    )
+    def test_path_with_params(self, spec, path):
+        @route(path, methods=["GET"])
+        def handler():
+            pass
 
-        spec.path(view=set_pet)
+        spec.path(view=handler)
         assert "/pet/{pet_id}/{shop_id}" in get_paths(spec)

pip install -e .[dev]
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
apispec==6.8.1
-e git+https://github.com/marshmallow-code/apispec-webframeworks.git@fa71207b856ce549886020f3ea9d7371d02eb2dc#egg=apispec_webframeworks
aspy.yaml==1.3.0
attrs==25.3.0
bottle==0.12.17
cachetools==5.5.2
cfgv==3.4.0
chardet==5.2.0
click==8.1.8
colorama==0.4.6
distlib==0.3.9
entrypoints==0.3
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
filelock==3.18.0
flake8==3.7.9
flake8-bugbear==19.8.0
Flask==1.1.1
identify==2.6.9
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
itsdangerous==2.2.0
Jinja2==3.1.6
MarkupSafe==3.0.2
mccabe==0.6.1
mock==5.2.0
nodeenv==1.9.1
packaging @ file:///croot/packaging_1734472117206/work
platformdirs==4.3.7
pluggy @ file:///croot/pluggy_1733169602837/work
pre-commit==1.21.0
pycodestyle==2.5.0
pyflakes==2.1.1
pyproject-api==1.9.0
pytest @ file:///croot/pytest_1738938843180/work
PyYAML==6.0.2
six==1.17.0
toml==0.10.2
tomli==2.2.1
tornado==6.4.2
tox==4.25.0
typing_extensions==4.13.0
virtualenv==20.29.3
Werkzeug==3.1.3

name: apispec-webframeworks
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
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_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
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=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:
      - apispec==6.8.1
      - aspy-yaml==1.3.0
      - attrs==25.3.0
      - bottle==0.12.17
      - cachetools==5.5.2
      - cfgv==3.4.0
      - chardet==5.2.0
      - click==8.1.8
      - colorama==0.4.6
      - distlib==0.3.9
      - entrypoints==0.3
      - filelock==3.18.0
      - flake8==3.7.9
      - flake8-bugbear==19.8.0
      - flask==1.1.1
      - identify==2.6.9
      - itsdangerous==2.2.0
      - jinja2==3.1.6
      - markupsafe==3.0.2
      - mccabe==0.6.1
      - mock==5.2.0
      - nodeenv==1.9.1
      - platformdirs==4.3.7
      - pre-commit==1.21.0
      - pycodestyle==2.5.0
      - pyflakes==2.1.1
      - pyproject-api==1.9.0
      - pyyaml==6.0.2
      - six==1.17.0
      - toml==0.10.2
      - tomli==2.2.1
      - tornado==6.4.2
      - tox==4.25.0
      - typing-extensions==4.13.0
      - virtualenv==20.29.3
      - werkzeug==3.1.3
prefix: /opt/conda/envs/apispec-webframeworks

src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_with_params[2.0-/pet/<pet_id:int>/<shop_id:re:[a-z]+>] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_with_params[3.0.0-/pet/<pet_id:int>/<shop_id:re:[a-z]+>]
src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_from_view[2.0] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_from_view[3.0.0] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_with_multiple_methods[2.0] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_with_multiple_methods[3.0.0] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_integration_with_docstring_introspection[2.0] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_integration_with_docstring_introspection[3.0.0] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_is_translated_to_openapi_template[2.0] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_is_translated_to_openapi_template[3.0.0] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_with_params[2.0-/pet/<pet_id>/<shop_id>] src/apispec_webframeworks/tests/test_ext_bottle.py::TestPathHelpers::test_path_with_params[3.0.0-/pet/<pet_id>/<shop_id>]
CHANGELOG.rst src/apispec_webframeworks/bottle.py
CHANGELOG.rst src/apispec_webframeworks/bottle.py