GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — gh-156444: Fix a negated character set with IGNORECASE and LOCALE by serhiy-storchaka · Pull Request #156445 · python/cpython

Conversation

@serhiy-storchaka

@serhiy-storchaka serhiy-storchaka commented Aug 27, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

charset_loc_ignore() tested the whole set once per locale case and returned true if either test matched. That complements a set before closing it under case rather than after, so [bc] matched b'B' and [^bc] matched it too.

It now walks the set itself and tries both cases for every member, which puts the closure on the members and leaves NEGATE complementing the closed set. SRE(charset) is untouched, and an uncased character short-circuits straight into it.

BIGCHARSET and RANGE_UNI_IGNORE are not handled: neither can occur in the set of a bytes pattern, and re.LOCALE rejects str patterns.

This also fixes gh-155985. The difference fusion is safe once the engine handles an embedded NEGATE correctly, so the workaround in GH-155993 is no longer needed:

>>> re.fullmatch(rb'\w(?<!b)', b'B', re.I | re.L)
>>> re.fullmatch(rb'[A-z--[0-m]]', b'N', re.I | re.L)

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@serhiy-storchaka @claude
pythongh-156444: Fix a negated character set with IGNORECASE and LOCALE
ded2f4c
charset_loc_ignore() tested the whole set once per locale case and took
the disjunction, which complements a set before closing it under case
instead of after: [bc] matched b'B', but so did [^bc].  Match both cases
of the character against every set member instead.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
@bedevere-app bedevere-app Bot mentioned this pull request Aug 27, 2026
re.IGNORECASE | re.LOCALE: a negated character set matches the other case #156444
Closed
@bedevere-app bedevere-app Bot added the awaiting core review label Aug 27, 2026
@serhiy-storchaka serhiy-storchaka added needs backport to 3.13 only security fixes needs backport to 3.14 bugs and security fixes needs backport to 3.15 bugs and security fixes labels Aug 27, 2026
@serhiy-storchaka
serhiy-storchaka merged commit 6671d27 into python:main Aug 27, 2026
108 of 110 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@miss-islington-app

miss-islington-app Bot commented Aug 27, 2026

Copy link
Copy Markdown

Thanks @serhiy-storchaka for the PR 🌮🎉.. I'm working now to backport this PR to: 3.13, 3.14, 3.15.
🐍🍒⛏🤖

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot removed the awaiting core review label Aug 27, 2026
@serhiy-storchaka
serhiy-storchaka deleted the gh-156444-charset-loc-ignore branch August 27, 2026 11:11
@bedevere-app

bedevere-app Bot commented Aug 27, 2026

Copy link
Copy Markdown

GH-156456 is a backport of this pull request to the 3.15 branch.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot removed the needs backport to 3.15 bugs and security fixes label Aug 27, 2026
@bedevere-app

bedevere-app Bot commented Aug 27, 2026

Copy link
Copy Markdown

GH-156457 is a backport of this pull request to the 3.14 branch.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot removed the needs backport to 3.14 bugs and security fixes label Aug 27, 2026
@bedevere-app

bedevere-app Bot commented Aug 27, 2026

Copy link
Copy Markdown

GH-156458 is a backport of this pull request to the 3.13 branch.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot removed the needs backport to 3.13 only security fixes label Aug 27, 2026
serhiy-storchaka added a commit that referenced this pull request Aug 27, 2026
@miss-islington @serhiy-storchaka @claude
[3.14] gh-156444: Fix a negated character set with IGNORECASE and LOC…
9ac4200
…ALE (GH-156445) (GH-156457)

charset_loc_ignore() tested the whole set once per locale case and took
the disjunction, which complements a set before closing it under case
instead of after: [bc] matched b'B', but so did [^bc].  Match both cases
of the character against every set member instead.
(cherry picked from commit 6671d27)

Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
serhiy-storchaka added a commit that referenced this pull request Aug 27, 2026
@miss-islington @serhiy-storchaka @claude
[3.13] gh-156444: Fix a negated character set with IGNORECASE and LOC…
7e7e88f
…ALE (GH-156445) (GH-156458)

charset_loc_ignore() tested the whole set once per locale case and took
the disjunction, which complements a set before closing it under case
instead of after: [bc] matched b'B', but so did [^bc].  Match both cases
of the character against every set member instead.
(cherry picked from commit 6671d27)

Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
clin1234 pushed a commit to clin1234/cpython that referenced this pull request Aug 27, 2026
@serhiy-storchaka @claude @clin1234
pythongh-156444: Fix a negated character set with IGNORECASE and LOCA…
ed08b1f
…LE (pythonGH-156445)

charset_loc_ignore() tested the whole set once per locale case and took
the disjunction, which complements a set before closing it under case
instead of after: [bc] matched b'B', but so did [^bc].  Match both cases
of the character against every set member instead.

Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
serhiy-storchaka added a commit that referenced this pull request Oct 10, 2026
@miss-islington @serhiy-storchaka @claude
[3.15] gh-156444: Fix a negated character set with IGNORECASE and LOC…
93de9ba
…ALE (GH-156445) (GH-156456)

charset_loc_ignore() tested the whole set once per locale case and took
the disjunction, which complements a set before closing it under case
instead of after: [bc] matched b'B', but so did [^bc].  Match both cases
of the character against every set member instead.
(cherry picked from commit 6671d27)

Co-authored-by: Serhiy Storchaka <[email protected]>
Co-authored-by: Claude Opus 5 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

No reviews

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Negative lookbehind ignored under re.IGNORECASE | re.LOCALE

Uh oh!

There was an error while loading. Please reload this page.

1 participant

@serhiy-storchaka
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.