pypa/pip · error · ClassNotFound

no lexer matching the text found

Error message

no lexer matching the text found

What it means

Raised by guess_lexer when no lexer's analyse_text() returned a score above 0.0 for the input text. After checking vim modelines, every known lexer is scored; if the best score is 0.0 or no lexer is selected, this is raised.

Source

Thrown at src/pip/_vendor/pygments/lexers/__init__.py:339

    # try to get a vim modeline first
    ft = get_filetype_from_buffer(_text)

    if ft is not None:
        try:
            return get_lexer_by_name(ft, **options)
        except ClassNotFound:
            pass

    best_lexer = [0.0, None]
    for lexer in _iter_lexerclasses():
        rv = lexer.analyse_text(_text)
        if rv == 1.0:
            return lexer(**options)
        if rv > best_lexer[0]:
            best_lexer[:] = (rv, lexer)
    if not best_lexer[0] or best_lexer[1] is None:
        raise ClassNotFound('no lexer matching the text found')
    return best_lexer[1](**options)


class _automodule(types.ModuleType):
    """Automatically import lexers."""

    def __getattr__(self, name):
        info = LEXERS.get(name)
        if info:
            _load_lexers(info[0])
            cls = _lexer_cache[info[1]]
            setattr(self, name, cls)
            return cls
        if name in COMPAT:
            return getattr(self, COMPAT[name])
        raise AttributeError(name)

View on GitHub (pinned to d7d0d0a394)

Solutions

  1. Provide longer, more representative text so analyse_text can score it.
  2. Specify the lexer explicitly with get_lexer_by_name.
  3. Pre-validate that the text is non-empty and plausibly source code.

Example fix

# before
lex = guess_lexer('x')  # too short to score
# after
lex = get_lexer_by_name('python')  # explicit
Defensive patterns

Strategy: fallback

Validate before calling

from pygments.lexers import guess_lexer, TextLexer
from pygments.util import ClassNotFound
def safe_guess(text):
    if not text or len(text.strip()) < 10:
        return TextLexer()
    try:
        return guess_lexer(text)
    except ClassNotFound:
        return TextLexer()

Try / catch

from pygments.util import ClassNotFound
from pygments.lexers import guess_lexer, TextLexer
try:
    lex = guess_lexer(text)
except ClassNotFound:
    lex = TextLexer()

Prevention

When it happens

Trigger: guess_lexer('') (empty), guess_lexer on very short/ambiguous text, or text in a language no installed lexer recognises.

Common situations: Auto-detecting a lexer for tiny snippets; binary/garbage content; niche language with no lexer; empty user input.

Related errors


AI-assisted analysis of pypa/pip@d7d0d0a394 (2026-08-04). Data as JSON: /data/errors/7db72898fdaca455.json. Report an issue: GitHub.