Skip to content

Inconsistent behaviour between pathlib.PurePath.match and glob.glob #118701

Description

@zhukoff-pavel

Bug report

Bug description:

Prerequisites

Hello! I have a structure of directories as follows:

% tree
.
└── a
    └── b
        └── c
            └── d
                └── e

Problem

Here Pathlib.PurePath a/b/c/d/e won't match with **/b/c/**, but will match with **/c/d/**:

Python 3.12.3 (main, Apr  9 2024, 08:09:14) [Clang 15.0.0 (clang-1500.3.9.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pathlib
>>> path = pathlib.PurePath("a/b/c/d/e")
>>> path.match("**/b/c/**")
False
>>> path.match("**/c/d/**")
True

However, glob on this structure yields different results:

>>> import glob
>>> glob.glob("**/b/c/**")
['a/b/c/d']
>>> glob.glob("**/c/d/**")
[]
>>> glob.glob("**/b/c/**", recursive=True)
['a/b/c/', 'a/b/c/d', 'a/b/c/d/e']
>>> glob.glob("**/c/d/**", recursive=True)
['a/b/c/d/', 'a/b/c/d/e']

i.e. **/b/c/** and **/c/d/** will match to the named path only in recursive mode.

Ideas

I'd expect pathlib.match to behave more like recursive glob.glob (as in prior code block) or pathlib.Path.glob:

>>> sorted(pathlib.Path(".").glob("**/b/c/**"))
[PosixPath('a/b/c'), PosixPath('a/b/c/d'), PosixPath('a/b/c/d/e')]
>>> sorted(pathlib.Path(".").glob("**/c/d/**"))
[PosixPath('a/b/c/d'), PosixPath('a/b/c/d/e')]

CPython versions tested on:

3.10, 3.12

Operating systems tested on:

Linux, macOS

Linked PRs

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions