PEP 440 version specifier checker

Paste a specifier from requirements.txt or pyproject.toml and a list of versions. See which versions pip accepts, which one it would pick, and why the others are rejected.

Runs entirely in your browser. Your data is never uploaded.

A specifier like >=1.0,<2 — or a whole requirement line such as requests[socks]>=2.28 ; python_version>='3.8'.

Try:

One per line (commas and spaces also work). Paste a release list to see what would be selected.

How pip reads each operator

These rows are checked by the same code that powers the tool above. "Matches" means the version is inside the range. Pre-release filtering is a separate step, covered below.

SpecifierMatchesDoes not match
==1.4.21.4.2, 1.4.2.0, 1.4.2+cpu1.4.3, 1.4.2.post1
==1.4.*1.4, 1.4.9, 1.4.9rc11.5, 1.40
!=1.5.*1.4.9, 1.61.5, 1.5.3
~=1.4.21.4.2, 1.4.101.4.1, 1.5
~=1.41.4, 1.91.3, 2.0
>1.41.4.1, 1.51.4.post1, 1.4+local
<1.51.4.91.5rc1, 1.5.dev0
>=1.41.4, 2.01.3.9
<=1.41.4, 1.4+local1.4.1

When pip installs pre-releases

pip skips alpha, beta, release-candidate and dev versions (2.0a1, 2.0b3, 2.0rc1, 2.0.dev4) unless one of these is true:

  1. the specifier itself names a pre-release, as in >=2.0rc1;
  2. you pass --pre (the checkbox above);
  3. no final release satisfies the specifier. A project with only 1.0b1 published still installs.

Common mistakes

About this checker

The matching engine is a TypeScript port of packaging 26.3, the library pip uses. It is tested against results produced by the real library for 65 specifiers × 65 versions, including invalid inputs and pre-release selection. Everything runs in your browser.