| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| 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 flags & SRE_FLAG_TEMPLATE: | |
| 112 | 105 | raise error("internal: unsupported template operator %r" % (op,)) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2366,6 +2366,16 @@ def test_template_function_and_flag_is_deprecated(self): | |||
| 2366 | 2366 | self.assertFalse(template_re1.match('nope')) | |
| 2367 | 2367 | ||
| 2368 | 2368 | def test_bug_gh106052(self): | |
| 2369 | + # gh-100061 | ||
| 2370 | + self.assertEqual(re.match('(?>(?:.(?!D))+)', 'ABCDE').span(), (0, 2)) | ||
| 2371 | + self.assertEqual(re.match('(?:.(?!D))++', 'ABCDE').span(), (0, 2)) | ||
| 2372 | + self.assertEqual(re.match('(?>(?:.(?!D))*)', 'ABCDE').span(), (0, 2)) | ||
| 2373 | + self.assertEqual(re.match('(?:.(?!D))*+', 'ABCDE').span(), (0, 2)) | ||
| 2374 | + self.assertEqual(re.match('(?>(?:.(?!D))?)', 'CDE').span(), (0, 0)) | ||
| 2375 | + self.assertEqual(re.match('(?:.(?!D))?+', 'CDE').span(), (0, 0)) | ||
| 2376 | + self.assertEqual(re.match('(?>(?:.(?!D)){1,3})', 'ABCDE').span(), (0, 2)) | ||
| 2377 | + self.assertEqual(re.match('(?:.(?!D)){1,3}+', 'ABCDE').span(), (0, 2)) | ||
| 2378 | + # gh-106052 | ||
| 2369 | 2379 | self.assertEqual(re.match("(?>(?:ab?c)+)", "aca").span(), (0, 2)) | |
| 2370 | 2380 | self.assertEqual(re.match("(?:ab?c)++", "aca").span(), (0, 2)) | |
| 2371 | 2381 | self.assertEqual(re.match("(?>(?:ab?c)*)", "aca").span(), (0, 2)) | |
@@ -2471,7 +2481,6 @@ def test_atomic_group(self): | |||
| 2471 | 2481 | 17: SUCCESS | |
| 2472 | 2482 | ''') | |
| 2473 | 2483 | ||
| 2474 | - @unittest.expectedFailure # gh-106052 | ||
| 2475 | 2484 | def test_possesive_repeat_one(self): | |
| 2476 | 2485 | self.assertEqual(get_debug_out(r'a?+'), '''\ | |
| 2477 | 2486 | POSSESSIVE_REPEAT 0 1 | |
@@ -2484,7 +2493,6 @@ def test_possesive_repeat_one(self): | |||
| 2484 | 2493 | 12: SUCCESS | |
| 2485 | 2494 | ''') | |
| 2486 | 2495 | ||
| 2487 | - @unittest.expectedFailure # gh-106052 | ||
| 2488 | 2496 | def test_possesive_repeat(self): | |
| 2489 | 2497 | self.assertEqual(get_debug_out(r'(?:ab)?+'), '''\ | |
| 2490 | 2498 | 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 | |
|---|---|---|---|
@@ -1334,6 +1334,10 @@ SRE(match)(SRE_STATE* state, const SRE_CODE* pattern, int toplevel) | |||
| 1334 | 1334 | MARK_POP(ctx->lastmark); | |
| 1335 | 1335 | LASTMARK_RESTORE(); | |
| 1336 | 1336 | ||
| 1337 | + /* Restore the global Input Stream pointer | ||
| 1338 | + since it can change after jumps. */ | ||
| 1339 | + state->ptr = ptr; | ||
| 1340 | + | ||
| 1337 | 1341 | /* We have sufficient matches, so exit loop. */ | |
| 1338 | 1342 | break; | |
| 1339 | 1343 | } | |
| Back | FazBrowse Home | New Git URL |
0 commit comments