Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 35.1k
gh-91524: Speed up the regular expression substitution#91525
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
c213b3750c435fa47446d5a7f8747bb228f2271aa878dc0277ab7ade7eebbff00d5e121c81744File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -984,24 +984,28 @@ def parse(str, flags=0, state=None): | ||
| return p | ||
| def parse_template(source, state): | ||
| def parse_template(source, pattern): | ||
gpshead marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| # parse 're' replacement string into list of literals and | ||
| # group references | ||
| s = Tokenizer(source) | ||
| sget = s.get | ||
| groups = [] | ||
| literals = [] | ||
| result = [] | ||
| literal = [] | ||
| lappend = literal.append | ||
| def addliteral(): | ||
| if s.istext: | ||
| result.append(''.join(literal)) | ||
| else: | ||
| # The tokenizer implicitly decodes bytes objects as latin-1, we must | ||
| # therefore re-encode the final representation. | ||
| result.append(''.join(literal).encode('latin-1')) | ||
| del literal[:] | ||
| def addgroup(index, pos): | ||
| if index > state.groups: | ||
| if index > pattern.groups: | ||
| raise s.error("invalid group reference %d" % index, pos) | ||
| if literal: | ||
| literals.append(''.join(literal)) | ||
| del literal[:] | ||
| groups.append((len(literals), index)) | ||
| literals.append(None) | ||
| groupindex = state.groupindex | ||
| addliteral() | ||
| result.append(index) | ||
| groupindex = pattern.groupindex | ||
| while True: | ||
| this = sget() | ||
| if this is None: | ||
| @@ -1063,22 +1067,5 @@ def addgroup(index, pos): | ||
| lappend(this) | ||
| else: | ||
| lappend(this) | ||
| if literal: | ||
| literals.append(''.join(literal)) | ||
| if not isinstance(source, str): | ||
| # The tokenizer implicitly decodes bytes objects as latin-1, we must | ||
| # therefore re-encode the final representation. | ||
| literals = [None if s is None else s.encode('latin-1') for s in literals] | ||
| return groups, literals | ||
| def expand_template(template, match): | ||
| g = match.group | ||
| empty = match.string[:0] | ||
| groups, literals = template | ||
| literals = literals[:] | ||
| try: | ||
| for index, group in groups: | ||
| literals[index] = g(group) or empty | ||
| except IndexError: | ||
| raise error("invalid group reference %d" % index) from None | ||
| return empty.join(literals) | ||
| addliteral() | ||
| return result | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| Speed up the regular expression substitution (functions :func:`re.sub` and | ||
| :func:`re.subn` and corresponding :class:`re.Pattern` methods) for | ||
| replacement strings containing group references by 2--3 times. |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.