| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent a86df29 commit abd9cc5
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -100,13 +100,6 @@ def _compile(code, pattern, flags): | |||
| 100 | 100 | emit(ANY_ALL) | |
| 101 | 101 | else: | |
| 102 | 102 | emit(ANY) | |
| 103 | - elif op is POSSESSIVE_REPEAT: | ||
| 104 | - # gh-106052: Possessive quantifiers do not work when the | ||
| 105 | - # subpattern contains backtracking, i.e. "(?:ab?c)*+". | ||
| 106 | - # Implement it as equivalent greedy qualifier in atomic group. | ||
| 107 | - p = [(MAX_REPEAT, av)] | ||
| 108 | - p = [(ATOMIC_GROUP, p)] | ||
| 109 | - _compile(code, p, flags) | ||
| 110 | 103 | elif op in REPEATING_CODES: | |
| 111 | 104 | if _simple(av[2]): | |
| 112 | 105 | emit(REPEATING_CODES[op][2]) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2342,7 +2342,17 @@ def test_bug_gh91616(self): | |||
| 2342 | 2342 | self.assertTrue(re.fullmatch(r'(?s:(?>.*?\.).*)\Z', "a.txt")) # reproducer | |
| 2343 | 2343 | self.assertTrue(re.fullmatch(r'(?s:(?=(?P<g0>.*?\.))(?P=g0).*)\Z', "a.txt")) | |
| 2344 | 2344 | ||
| 2345 | - def test_bug_gh106052(self): | ||
| 2345 | + def test_bug_gh100061(self): | ||
| 2346 | + # gh-100061 | ||
| 2347 | + self.assertEqual(re.match('(?>(?:.(?!D))+)', 'ABCDE').span(), (0, 2)) | ||
| 2348 | + self.assertEqual(re.match('(?:.(?!D))++', 'ABCDE').span(), (0, 2)) | ||
| 2349 | + self.assertEqual(re.match('(?>(?:.(?!D))*)', 'ABCDE').span(), (0, 2)) | ||
| 2350 | + self.assertEqual(re.match('(?:.(?!D))*+', 'ABCDE').span(), (0, 2)) | ||
| 2351 | + self.assertEqual(re.match('(?>(?:.(?!D))?)', 'CDE').span(), (0, 0)) | ||
| 2352 | + self.assertEqual(re.match('(?:.(?!D))?+', 'CDE').span(), (0, 0)) | ||
| 2353 | + self.assertEqual(re.match('(?>(?:.(?!D)){1,3})', 'ABCDE').span(), (0, 2)) | ||
| 2354 | + self.assertEqual(re.match('(?:.(?!D)){1,3}+', 'ABCDE').span(), (0, 2)) | ||
| 2355 | + # gh-106052 | ||
| 2346 | 2356 | self.assertEqual(re.match("(?>(?:ab?c)+)", "aca").span(), (0, 2)) | |
| 2347 | 2357 | self.assertEqual(re.match("(?:ab?c)++", "aca").span(), (0, 2)) | |
| 2348 | 2358 | self.assertEqual(re.match("(?>(?:ab?c)*)", "aca").span(), (0, 2)) | |
@@ -2451,7 +2461,6 @@ def test_atomic_group(self): | |||
| 2451 | 2461 | 17: SUCCESS | |
| 2452 | 2462 | ''') | |
| 2453 | 2463 | ||
| 2454 | - @unittest.expectedFailure # gh-106052 | ||
| 2455 | 2464 | def test_possesive_repeat_one(self): | |
| 2456 | 2465 | self.assertEqual(get_debug_out(r'a?+'), '''\ | |
| 2457 | 2466 | POSSESSIVE_REPEAT 0 1 | |
@@ -2464,7 +2473,6 @@ def test_possesive_repeat_one(self): | |||
| 2464 | 2473 | 12: SUCCESS | |
| 2465 | 2474 | ''') | |
| 2466 | 2475 | ||
| 2467 | - @unittest.expectedFailure # gh-106052 | ||
| 2468 | 2476 | def test_possesive_repeat(self): | |
| 2469 | 2477 | self.assertEqual(get_debug_out(r'(?:ab)?+'), '''\ | |
| 2470 | 2478 | POSSESSIVE_REPEAT 0 1 | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,2 @@ | |||
| 1 | + Fix a bug that causes wrong matches for regular expressions with possessive | ||
| 2 | + qualifier. | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1336,6 +1336,10 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) | |||
| 1336 | 1336 | MARK_POP(ctx->lastmark); | |
| 1337 | 1337 | LASTMARK_RESTORE(); | |
| 1338 | 1338 | ||
| 1339 | + /* Restore the global Input Stream pointer | ||
| 1340 | + since it can change after jumps. */ | ||
| 1341 | + state->ptr = ptr; | ||
| 1342 | + | ||
| 1339 | 1343 | /* We have sufficient matches, so exit loop. */ | |
| 1340 | 1344 | break; | |
| 1341 | 1345 | } | |
| Back | FazBrowse Home | New Git URL |
0 commit comments