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
- Provide longer, more representative text so analyse_text can score it.
- Specify the lexer explicitly with get_lexer_by_name.
- 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
- Require a minimum text length before guessing.
- Always keep a TextLexer fallback for user-supplied content.
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
- lex() argument must be a lexer instance, not a class
- No such group
- uncompilable regex {tdef[0]!r} in state {state!r} of {cls!r}
- no lexer for alias {_alias!r} found
- no valid {lexername} class found in {filename}
AI-assisted analysis of pypa/pip@d7d0d0a394 (2026-08-04).
Data as JSON: /data/errors/7db72898fdaca455.json.
Report an issue: GitHub.