Skip to main content

Alternative regular expression module, to replace re.

Project description

Introduction

This regex implementation is backwards-compatible with the standard ‘re’ module, but offers additional functionality.

Note

The re module’s behaviour with zero-width matches changed in Python 3.7, and this module follows that behaviour when compiled for Python 3.7.

Python 2

Python 2 is no longer supported. The last release that supported Python 2 was 2021.11.10.

PyPy

This module is targeted at CPython. It expects that all codepoints are the same width, so it won’t behave properly with PyPy outside U+0000..U+007F because PyPy stores strings as UTF-8.

Multithreading

The regex module releases the GIL during matching on instances of the built-in (immutable) string classes, enabling other Python threads to run concurrently. It is also possible to force the regex module to release the GIL during matching by calling the matching methods with the keyword argument concurrent=True. The behaviour is undefined if the string changes during matching, so use it only when it is guaranteed that that won’t happen.

Unicode

This module supports Unicode 15.1.0. Full Unicode case-folding is supported.

Flags

There are 2 kinds of flag: scoped and global. Scoped flags can apply to only part of a pattern and can be turned on or off; global flags apply to the entire pattern and can only be turned on.

The scoped flags are: ASCII (?a), FULLCASE (?f), IGNORECASE (?i), LOCALE (?L), MULTILINE (?m), DOTALL (?s), UNICODE (?u), VERBOSE (?x), WORD (?w).

The global flags are: BESTMATCH (?b), ENHANCEMATCH (?e), POSIX (?p), REVERSE (?r), VERSION0 (?V0), VERSION1 (?V1).

If neither the ASCII, LOCALE nor UNICODE flag is specified, it will default to UNICODE if the regex pattern is a Unicode string and ASCII if it’s a bytestring.

The ENHANCEMATCH flag makes fuzzy matching attempt to improve the fit of the next match that it finds.

The BESTMATCH flag makes fuzzy matching search for the best match instead of the next match.

Old vs new behaviour

In order to be compatible with the re module, this module has 2 behaviours:

  • Version 0 behaviour (old behaviour, compatible with the re module):

    Please note that the re module’s behaviour may change over time, and I’ll endeavour to match that behaviour in version 0.

    • Indicated by the VERSION0 flag.

    • Zero-width matches are not handled correctly in the re module before Python 3.7. The behaviour in those earlier versions is:

      • .split won’t split a string at a zero-width match.

      • .sub will advance by one character after a zero-width match.

    • Inline flags apply to the entire pattern, and they can’t be turned off.

    • Only simple sets are supported.

    • Case-insensitive matches in Unicode use simple case-folding by default.

  • Version 1 behaviour (new behaviour, possibly different from the re module):

    • Indicated by the VERSION1 flag.

    • Zero-width matches are handled correctly.

    • Inline flags apply to the end of the group or pattern, and they can be turned off.

    • Nested sets and set operations are supported.

    • Case-insensitive matches in Unicode use full case-folding by default.

If no version is specified, the regex module will default to regex.DEFAULT_VERSION.

Case-insensitive matches in Unicode

The regex module supports both simple and full case-folding for case-insensitive matches in Unicode. Use of full case-folding can be turned on using the FULLCASE flag. Please note that this flag affects how the IGNORECASE flag works; the FULLCASE flag itself does not turn on case-insensitive matching.

Version 0 behaviour: the flag is off by default.

Version 1 behaviour: the flag is on by default.

Nested sets and set operations

It’s not possible to support both simple sets, as used in the re module, and nested sets at the same time because of a difference in the meaning of an unescaped "[" in a set.

For example, the pattern [[a-z]--[aeiou]] is treated in the version 0 behaviour (simple sets, compatible with the re module) as:

  • Set containing “[” and the letters “a” to “z”

  • Literal “–”

  • Set containing letters “a”, “e”, “i”, “o”, “u”

  • Literal “]”

but in the version 1 behaviour (nested sets, enhanced behaviour) as:

  • Set which is:

    • Set containing the letters “a” to “z”

  • but excluding:

    • Set containing the letters “a”, “e”, “i”, “o”, “u”

Version 0 behaviour: only simple sets are supported.

Version 1 behaviour: nested sets and set operations are supported.

Notes on named groups

All groups have a group number, starting from 1.

Groups with the same group name will have the same group number, and groups with a different group name will have a different group number.

The same name can be used by more than one group, with later captures ‘overwriting’ earlier captures. All the captures of the group will be available from the captures method of the match object.

Group numbers will be reused across different branches of a branch reset, eg. (?|(first)|(second)) has only group 1. If groups have different group names then they will, of course, have different group numbers, eg. (?|(?P<foo>first)|(?P<bar>second)) has group 1 (“foo”) and group 2 (“bar”).

In the regex (\s+)(?|(?P<foo>[A-Z]+)|(\w+) (?P<foo>[0-9]+) there are 2 groups:

  • (\s+) is group 1.

  • (?P<foo>[A-Z]+) is group 2, also called “foo”.

  • (\w+) is group 2 because of the branch reset.

  • (?P<foo>[0-9]+) is group 2 because it’s called “foo”.

If you want to prevent (\w+) from being group 2, you need to name it (different name, different group number).

Additional features

The issue numbers relate to the Python bug tracker, except where listed otherwise.

Added \p{Horiz_Space} and \p{Vert_Space} (GitHub issue 477)

\p{Horiz_Space} or \p{H} matches horizontal whitespace and \p{Vert_Space} or \p{V} matches vertical whitespace.

Added support for lookaround in conditional pattern (Hg issue 163)

The test of a conditional pattern can be a lookaround.

>>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
<regex.Match object; span=(0, 3), match='123'>
>>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
<regex.Match object; span=(0, 6), match='abc123'>

This is not quite the same as putting a lookaround in the first branch of a pair of alternatives.

>>> print(regex.match(r'(?:(?=\d)\d+\b|\w+)', '123abc'))
<regex.Match object; span=(0, 6), match='123abc'>
>>> print(regex.match(r'(?(?=\d)\d+\b|\w+)', '123abc'))
None

In the first example, the lookaround matched, but the remainder of the first branch failed to match, and so the second branch was attempted, whereas in the second example, the lookaround matched, and the first branch failed to match, but the second branch was not attempted.

Added POSIX matching (leftmost longest) (Hg issue 150)

The POSIX standard for regex is to return the leftmost longest match. This can be turned on using the POSIX flag.

>>> # Normal matching.
>>> regex.search(r'Mr|Mrs', 'Mrs')
<regex.Match object; span=(0, 2), match='Mr'>
>>> regex.search(r'one(self)?(selfsufficient)?', 'oneselfsufficient')
<regex.Match object; span=(0, 7), match='oneself'>
>>> # POSIX matching.
>>> regex.search(r'(?p)Mr|Mrs', 'Mrs')
<regex.Match object; span=(0, 3), match='Mrs'>
>>> regex.search(r'(?p)one(self)?(selfsufficient)?', 'oneselfsufficient')
<regex.Match object; span=(0, 17), match='oneselfsufficient'>

Note that it will take longer to find matches because when it finds a match at a certain position, it won’t return that immediately, but will keep looking to see if there’s another longer match there.

Added (?(DEFINE)...) (Hg issue 152)

If there’s no group called “DEFINE”, then … will be ignored except that any groups defined within it can be called and that the normal rules for numbering groups still apply.

>>> regex.search(r'(?(DEFINE)(?P<quant>\d+)(?P<item>\w+))(?&quant) (?&item)', '5 elephants')
<regex.Match object; span=(0, 11), match='5 elephants'>

Added (*PRUNE), (*SKIP) and (*FAIL) (Hg issue 153)

(*PRUNE) discards the backtracking info up to that point. When used in an atomic group or a lookaround, it won’t affect the enclosing pattern.

(*SKIP) is similar to (*PRUNE), except that it also sets where in the text the next attempt to match will start. When used in an atomic group or a lookaround, it won’t affect the enclosing pattern.

(*FAIL) causes immediate backtracking. (*F) is a permitted abbreviation.

Added \K (Hg issue 151)

Keeps the part of the entire match after the position where \K occurred; the part before it is discarded.

It does not affect what groups return.

>>> m = regex.search(r'(\w\w\K\w\w\w)', 'abcdef')
>>> m[0]
'cde'
>>> m[1]
'abcde'
>>>
>>> m = regex.search(r'(?r)(\w\w\K\w\w\w)', 'abcdef')
>>> m[0]
'bc'
>>> m[1]
'bcdef'

Added capture subscripting for expandf and subf/subfn (Hg issue 133)

You can use subscripting to get the captures of a repeated group.

>>> m = regex.match(r"(\w)+", "abc")
>>> m.expandf("{1}")
'c'
>>> m.expandf("{1[0]} {1[1]} {1[2]}")
'a b c'
>>> m.expandf("{1[-1]} {1[-2]} {1[-3]}")
'c b a'
>>>
>>> m = regex.match(r"(?P<letter>\w)+", "abc")
>>> m.expandf("{letter}")
'c'
>>> m.expandf("{letter[0]} {letter[1]} {letter[2]}")
'a b c'
>>> m.expandf("{letter[-1]} {letter[-2]} {letter[-3]}")
'c b a'

Added support for referring to a group by number using (?P=...)

This is in addition to the existing \g<...>.

Fixed the handling of locale-sensitive regexes

The LOCALE flag is intended for legacy code and has limited support. You’re still recommended to use Unicode instead.

Added partial matches (Hg issue 102)

A partial match is one that matches up to the end of string, but that string has been truncated and you want to know whether a complete match could be possible if the string had not been truncated.

Partial matches are supported by match, search, fullmatch and finditer with the partial keyword argument.

Match objects have a partial attribute, which is True if it’s a partial match.

For example, if you wanted a user to enter a 4-digit number and check it character by character as it was being entered:

>>> pattern = regex.compile(r'\d{4}')

>>> # Initially, nothing has been entered:
>>> print(pattern.fullmatch('', partial=True))
<regex.Match object; span=(0, 0), match='', partial=True>

>>> # An empty string is OK, but it's only a partial match.
>>> # The user enters a letter:
>>> print(pattern.fullmatch('a', partial=True))
None
>>> # It'll never match.

>>> # The user deletes that and enters a digit:
>>> print(pattern.fullmatch('1', partial=True))
<regex.Match object; span=(0, 1), match='1', partial=True>
>>> # It matches this far, but it's only a partial match.

>>> # The user enters 2 more digits:
>>> print(pattern.fullmatch('123', partial=True))
<regex.Match object; span=(0, 3), match='123', partial=True>
>>> # It matches this far, but it's only a partial match.

>>> # The user enters another digit:
>>> print(pattern.fullmatch('1234', partial=True))
<regex.Match object; span=(0, 4), match='1234'>
>>> # It's a complete match.

>>> # If the user enters another digit:
>>> print(pattern.fullmatch('12345', partial=True))
None
>>> # It's no longer a match.

>>> # This is a partial match:
>>> pattern.match('123', partial=True).partial
True

>>> # This is a complete match:
>>> pattern.match('1233', partial=True).partial
False

* operator not working correctly with sub() (Hg issue 106)

Sometimes it’s not clear how zero-width matches should be handled. For example, should .* match 0 characters directly after matching >0 characters?

# Python 3.7 and later
>>> regex.sub('.*', 'x', 'test')
'xx'
>>> regex.sub('.*?', '|', 'test')
'|||||||||'

# Python 3.6 and earlier
>>> regex.sub('(?V0).*', 'x', 'test')
'x'
>>> regex.sub('(?V1).*', 'x', 'test')
'xx'
>>> regex.sub('(?V0).*?', '|', 'test')
'|t|e|s|t|'
>>> regex.sub('(?V1).*?', '|', 'test')
'|||||||||'

Added capturesdict (Hg issue 86)

capturesdict is a combination of groupdict and captures:

groupdict returns a dict of the named groups and the last capture of those groups.

captures returns a list of all the captures of a group

capturesdict returns a dict of the named groups and lists of all the captures of those groups.

>>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
>>> m.groupdict()
{'word': 'three', 'digits': '3'}
>>> m.captures("word")
['one', 'two', 'three']
>>> m.captures("digits")
['1', '2', '3']
>>> m.capturesdict()
{'word': ['one', 'two', 'three'], 'digits': ['1', '2', '3']}

Added allcaptures and allspans (Git issue 474)

allcaptures returns a list of all the captures of all the groups.

allspans returns a list of all the spans of the all captures of all the groups.

>>> m = regex.match(r"(?:(?P<word>\w+) (?P<digits>\d+)\n)+", "one 1\ntwo 2\nthree 3\n")
>>> m.allcaptures()
(['one 1\ntwo 2\nthree 3\n'], ['one', 'two', 'three'], ['1', '2', '3'])
>>> m.allspans()
([(0, 20)], [(0, 3), (6, 9), (12, 17)], [(4, 5), (10, 11), (18, 19)])

Allow duplicate names of groups (Hg issue 87)

Group names can be duplicated.

>>> # With optional groups:
>>>
>>> # Both groups capture, the second capture 'overwriting' the first.
>>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or second")
>>> m.group("item")
'second'
>>> m.captures("item")
['first', 'second']
>>> # Only the second group captures.
>>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", " or second")
>>> m.group("item")
'second'
>>> m.captures("item")
['second']
>>> # Only the first group captures.
>>> m = regex.match(r"(?P<item>\w+)? or (?P<item>\w+)?", "first or ")
>>> m.group("item")
'first'
>>> m.captures("item")
['first']
>>>
>>> # With mandatory groups:
>>>
>>> # Both groups capture, the second capture 'overwriting' the first.
>>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)?", "first or second")
>>> m.group("item")
'second'
>>> m.captures("item")
['first', 'second']
>>> # Again, both groups capture, the second capture 'overwriting' the first.
>>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", " or second")
>>> m.group("item")
'second'
>>> m.captures("item")
['', 'second']
>>> # And yet again, both groups capture, the second capture 'overwriting' the first.
>>> m = regex.match(r"(?P<item>\w*) or (?P<item>\w*)", "first or ")
>>> m.group("item")
''
>>> m.captures("item")
['first', '']

Added fullmatch (issue #16203)

fullmatch behaves like match, except that it must match all of the string.

>>> print(regex.fullmatch(r"abc", "abc").span())
(0, 3)
>>> print(regex.fullmatch(r"abc", "abcx"))
None
>>> print(regex.fullmatch(r"abc", "abcx", endpos=3).span())
(0, 3)
>>> print(regex.fullmatch(r"abc", "xabcy", pos=1, endpos=4).span())
(1, 4)
>>>
>>> regex.match(r"a.*?", "abcd").group(0)
'a'
>>> regex.fullmatch(r"a.*?", "abcd").group(0)
'abcd'

Added subf and subfn

subf and subfn are alternatives to sub and subn respectively. When passed a replacement string, they treat it as a format string.

>>> regex.subf(r"(\w+) (\w+)", "{0} => {2} {1}", "foo bar")
'foo bar => bar foo'
>>> regex.subf(r"(?P<word1>\w+) (?P<word2>\w+)", "{word2} {word1}", "foo bar")
'bar foo'

Added expandf to match object

expandf is an alternative to expand. When passed a replacement string, it treats it as a format string.

>>> m = regex.match(r"(\w+) (\w+)", "foo bar")
>>> m.expandf("{0} => {2} {1}")
'foo bar => bar foo'
>>>
>>> m = regex.match(r"(?P<word1>\w+) (?P<word2>\w+)", "foo bar")
>>> m.expandf("{word2} {word1}")
'bar foo'

Detach searched string

A match object contains a reference to the string that was searched, via its string attribute. The detach_string method will ‘detach’ that string, making it available for garbage collection, which might save valuable memory if that string is very large.

>>> m = regex.search(r"\w+", "Hello world")
>>> print(m.group())
Hello
>>> print(m.string)
Hello world
>>> m.detach_string()
>>> print(m.group())
Hello
>>> print(m.string)
None

Recursive patterns (Hg issue 27)

Recursive and repeated patterns are supported.

(?R) or (?0) tries to match the entire regex recursively. (?1), (?2), etc, try to match the relevant group.

(?&name) tries to match the named group.

>>> regex.match(r"(Tarzan|Jane) loves (?1)", "Tarzan loves Jane").groups()
('Tarzan',)
>>> regex.match(r"(Tarzan|Jane) loves (?1)", "Jane loves Tarzan").groups()
('Jane',)

>>> m = regex.search(r"(\w)(?:(?R)|(\w?))\1", "kayak")
>>> m.group(0, 1, 2)
('kayak', 'k', None)

The first two examples show how the subpattern within the group is reused, but is _not_ itself a group. In other words, "(Tarzan|Jane) loves (?1)" is equivalent to "(Tarzan|Jane) loves (?:Tarzan|Jane)".

It’s possible to backtrack into a recursed or repeated group.

You can’t call a group if there is more than one group with that group name or group number ("ambiguous group reference").

The alternative forms (?P>name) and (?P&name) are also supported.

Full Unicode case-folding is supported

In version 1 behaviour, the regex module uses full case-folding when performing case-insensitive matches in Unicode.

>>> regex.match(r"(?iV1)strasse", "stra\N{LATIN SMALL LETTER SHARP S}e").span()
(0, 6)
>>> regex.match(r"(?iV1)stra\N{LATIN SMALL LETTER SHARP S}e", "STRASSE").span()
(0, 7)

In version 0 behaviour, it uses simple case-folding for backward compatibility with the re module.

Approximate “fuzzy” matching (Hg issue 12, Hg issue 41, Hg issue 109)

Regex usually attempts an exact match, but sometimes an approximate, or “fuzzy”, match is needed, for those cases where the text being searched may contain errors in the form of inserted, deleted or substituted characters.

A fuzzy regex specifies which types of errors are permitted, and, optionally, either the minimum and maximum or only the maximum permitted number of each type. (You cannot specify only a minimum.)

The 3 types of error are:

  • Insertion, indicated by “i”

  • Deletion, indicated by “d”

  • Substitution, indicated by “s”

In addition, “e” indicates any type of error.

The fuzziness of a regex item is specified between “{” and “}” after the item.

Examples:

  • foo match “foo” exactly

  • (?:foo){i} match “foo”, permitting insertions

  • (?:foo){d} match “foo”, permitting deletions

  • (?:foo){s} match “foo”, permitting substitutions

  • (?:foo){i,s} match “foo”, permitting insertions and substitutions

  • (?:foo){e} match “foo”, permitting errors

If a certain type of error is specified, then any type not specified will not be permitted.

In the following examples I’ll omit the item and write only the fuzziness:

  • {d<=3} permit at most 3 deletions, but no other types

  • {i<=1,s<=2} permit at most 1 insertion and at most 2 substitutions, but no deletions

  • {1<=e<=3} permit at least 1 and at most 3 errors

  • {i<=2,d<=2,e<=3} permit at most 2 insertions, at most 2 deletions, at most 3 errors in total, but no substitutions

It’s also possible to state the costs of each type of error and the maximum permitted total cost.

Examples:

  • {2i+2d+1s<=4} each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4

  • {i<=1,d<=1,s<=1,2i+2d+1s<=4} at most 1 insertion, at most 1 deletion, at most 1 substitution; each insertion costs 2, each deletion costs 2, each substitution costs 1, the total cost must not exceed 4

You can also use “<” instead of “<=” if you want an exclusive minimum or maximum.

You can add a test to perform on a character that’s substituted or inserted.

Examples:

  • {s<=2:[a-z]} at most 2 substitutions, which must be in the character set [a-z].

  • {s<=2,i<=3:\d} at most 2 substitutions, at most 3 insertions, which must be digits.

By default, fuzzy matching searches for the first match that meets the given constraints. The ENHANCEMATCH flag will cause it to attempt to improve the fit (i.e. reduce the number of errors) of the match that it has found.

The BESTMATCH flag will make it search for the best match instead.

Further examples to note:

  • regex.search("(dog){e}", "cat and dog")[1] returns "cat" because that matches "dog" with 3 errors (an unlimited number of errors is permitted).

  • regex.search("(dog){e<=1}", "cat and dog")[1] returns " dog" (with a leading space) because that matches "dog" with 1 error, which is within the limit.

  • regex.search("(?e)(dog){e<=1}", "cat and dog")[1] returns "dog" (without a leading space) because the fuzzy search matches " dog" with 1 error, which is within the limit, and the (?e) then it attempts a better fit.

In the first two examples there are perfect matches later in the string, but in neither case is it the first possible match.

The match object has an attribute fuzzy_counts which gives the total number of substitutions, insertions and deletions.

>>> # A 'raw' fuzzy match:
>>> regex.fullmatch(r"(?:cats|cat){e<=1}", "cat").fuzzy_counts
(0, 0, 1)
>>> # 0 substitutions, 0 insertions, 1 deletion.

>>> # A better match might be possible if the ENHANCEMATCH flag used:
>>> regex.fullmatch(r"(?e)(?:cats|cat){e<=1}", "cat").fuzzy_counts
(0, 0, 0)
>>> # 0 substitutions, 0 insertions, 0 deletions.

The match object also has an attribute fuzzy_changes which gives a tuple of the positions of the substitutions, insertions and deletions.

>>> m = regex.search('(fuu){i<=2,d<=2,e<=5}', 'anaconda foo bar')
>>> m
<regex.Match object; span=(7, 10), match='a f', fuzzy_counts=(0, 2, 2)>
>>> m.fuzzy_changes
([], [7, 8], [10, 11])

What this means is that if the matched part of the string had been:

'anacondfuuoo bar'

it would’ve been an exact match.

However, there were insertions at positions 7 and 8:

'anaconda fuuoo bar'
        ^^

and deletions at positions 10 and 11:

'anaconda f~~oo bar'
           ^^

So the actual string was:

'anaconda foo bar'

Named lists \L<name> (Hg issue 11)

There are occasions where you may want to include a list (actually, a set) of options in a regex.

One way is to build the pattern like this:

>>> p = regex.compile(r"first|second|third|fourth|fifth")

but if the list is large, parsing the resulting regex can take considerable time, and care must also be taken that the strings are properly escaped and properly ordered, for example, “cats” before “cat”.

The new alternative is to use a named list:

>>> option_set = ["first", "second", "third", "fourth", "fifth"]
>>> p = regex.compile(r"\L<options>", options=option_set)

The order of the items is irrelevant, they are treated as a set. The named lists are available as the .named_lists attribute of the pattern object :

>>> print(p.named_lists)
{'options': frozenset({'third', 'first', 'fifth', 'fourth', 'second'})}

If there are any unused keyword arguments, ValueError will be raised unless you tell it otherwise:

>>> option_set = ["first", "second", "third", "fourth", "fifth"]
>>> p = regex.compile(r"\L<options>", options=option_set, other_options=[])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python310\lib\site-packages\regex\regex.py", line 353, in compile
    return _compile(pattern, flags, ignore_unused, kwargs, cache_pattern)
  File "C:\Python310\lib\site-packages\regex\regex.py", line 500, in _compile
    complain_unused_args()
  File "C:\Python310\lib\site-packages\regex\regex.py", line 483, in complain_unused_args
    raise ValueError('unused keyword argument {!a}'.format(any_one))
ValueError: unused keyword argument 'other_options'
>>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=True)
>>> p = regex.compile(r"\L<options>", options=option_set, other_options=[], ignore_unused=False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python310\lib\site-packages\regex\regex.py", line 353, in compile
    return _compile(pattern, flags, ignore_unused, kwargs, cache_pattern)
  File "C:\Python310\lib\site-packages\regex\regex.py", line 500, in _compile
    complain_unused_args()
  File "C:\Python310\lib\site-packages\regex\regex.py", line 483, in complain_unused_args
    raise ValueError('unused keyword argument {!a}'.format(any_one))
ValueError: unused keyword argument 'other_options'
>>>

Start and end of word

\m matches at the start of a word.

\M matches at the end of a word.

Compare with \b, which matches at the start or end of a word.

Unicode line separators

Normally the only line separator is \n (\x0A), but if the WORD flag is turned on then the line separators are \x0D\x0A, \x0A, \x0B, \x0C and \x0D, plus \x85, \u2028 and \u2029 when working with Unicode.

This affects the regex dot ".", which, with the DOTALL flag turned off, matches any character except a line separator. It also affects the line anchors ^ and $ (in multiline mode).

Set operators

Version 1 behaviour only

Set operators have been added, and a set [...] can include nested sets.

The operators, in order of increasing precedence, are:

  • || for union (“x||y” means “x or y”)

  • ~~ (double tilde) for symmetric difference (“x~~y” means “x or y, but not both”)

  • && for intersection (“x&&y” means “x and y”)

  • -- (double dash) for difference (“x–y” means “x but not y”)

Implicit union, ie, simple juxtaposition like in [ab], has the highest precedence. Thus, [ab&&cd] is the same as [[a||b]&&[c||d]].

Examples:

  • [ab] # Set containing ‘a’ and ‘b’

  • [a-z] # Set containing ‘a’ .. ‘z’

  • [[a-z]--[qw]] # Set containing ‘a’ .. ‘z’, but not ‘q’ or ‘w’

  • [a-z--qw] # Same as above

  • [\p{L}--QW] # Set containing all letters except ‘Q’ and ‘W’

  • [\p{N}--[0-9]] # Set containing all numbers except ‘0’ .. ‘9’

  • [\p{ASCII}&&\p{Letter}] # Set containing all characters which are ASCII and letter

regex.escape (issue #2650)

regex.escape has an additional keyword parameter special_only. When True, only ‘special’ regex characters, such as ‘?’, are escaped.

>>> regex.escape("foo!?", special_only=False)
'foo\\!\\?'
>>> regex.escape("foo!?", special_only=True)
'foo!\\?'

regex.escape (Hg issue 249)

regex.escape has an additional keyword parameter literal_spaces. When True, spaces are not escaped.

>>> regex.escape("foo bar!?", literal_spaces=False)
'foo\\ bar!\\?'
>>> regex.escape("foo bar!?", literal_spaces=True)
'foo bar!\\?'

Repeated captures (issue #7132)

A match object has additional methods which return information on all the successful matches of a repeated group. These methods are:

  • matchobject.captures([group1, ...])

    • Returns a list of the strings matched in a group or groups. Compare with matchobject.group([group1, ...]).

  • matchobject.starts([group])

    • Returns a list of the start positions. Compare with matchobject.start([group]).

  • matchobject.ends([group])

    • Returns a list of the end positions. Compare with matchobject.end([group]).

  • matchobject.spans([group])

    • Returns a list of the spans. Compare with matchobject.span([group]).

>>> m = regex.search(r"(\w{3})+", "123456789")
>>> m.group(1)
'789'
>>> m.captures(1)
['123', '456', '789']
>>> m.start(1)
6
>>> m.starts(1)
[0, 3, 6]
>>> m.end(1)
9
>>> m.ends(1)
[3, 6, 9]
>>> m.span(1)
(6, 9)
>>> m.spans(1)
[(0, 3), (3, 6), (6, 9)]

Atomic grouping (?>...) (issue #433030)

If the following pattern subsequently fails, then the subpattern as a whole will fail.

Possessive quantifiers

(?:...)?+ ; (?:...)*+ ; (?:...)++ ; (?:...){min,max}+

The subpattern is matched up to ‘max’ times. If the following pattern subsequently fails, then all the repeated subpatterns will fail as a whole. For example, (?:...)++ is equivalent to (?>(?:...)+).

Scoped flags (issue #433028)

(?flags-flags:...)

The flags will apply only to the subpattern. Flags can be turned on or off.

Definition of ‘word’ character (issue #1693050)

The definition of a ‘word’ character has been expanded for Unicode. It conforms to the Unicode specification at http://www.unicode.org/reports/tr29/.

Variable-length lookbehind

A lookbehind can match a variable-length string.

Flags argument for regex.split, regex.sub and regex.subn (issue #3482)

regex.split, regex.sub and regex.subn support a ‘flags’ argument.

Pos and endpos arguments for regex.sub and regex.subn

regex.sub and regex.subn support ‘pos’ and ‘endpos’ arguments.

‘Overlapped’ argument for regex.findall and regex.finditer

regex.findall and regex.finditer support an ‘overlapped’ flag which permits overlapped matches.

Splititer

regex.splititer has been added. It’s a generator equivalent of regex.split.

Subscripting match objects for groups

A match object accepts access to the groups via subscripting and slicing:

>>> m = regex.search(r"(?P<before>.*?)(?P<num>\d+)(?P<after>.*)", "pqr123stu")
>>> print(m["before"])
pqr
>>> print(len(m))
4
>>> print(m[:])
('pqr123stu', 'pqr', '123', 'stu')

Named groups

Groups can be named with (?<name>...) as well as the existing (?P<name>...).

Group references

Groups can be referenced within a pattern with \g<name>. This also allows there to be more than 99 groups.

Named characters \N{name}

Named characters are supported. Note that only those known by Python’s Unicode database will be recognised.

Unicode codepoint properties, including scripts and blocks

\p{property=value}; \P{property=value}; \p{value} ; \P{value}

Many Unicode properties are supported, including blocks and scripts. \p{property=value} or \p{property:value} matches a character whose property property has value value. The inverse of \p{property=value} is \P{property=value} or \p{^property=value}.

If the short form \p{value} is used, the properties are checked in the order: General_Category, Script, Block, binary property:

  • Latin, the ‘Latin’ script (Script=Latin).

  • BasicLatin, the ‘BasicLatin’ block (Block=BasicLatin).

  • Alphabetic, the ‘Alphabetic’ binary property (Alphabetic=Yes).

A short form starting with Is indicates a script or binary property:

  • IsLatin, the ‘Latin’ script (Script=Latin).

  • IsAlphabetic, the ‘Alphabetic’ binary property (Alphabetic=Yes).

A short form starting with In indicates a block property:

  • InBasicLatin, the ‘BasicLatin’ block (Block=BasicLatin).

POSIX character classes

[[:alpha:]]; [[:^alpha:]]

POSIX character classes are supported. These are normally treated as an alternative form of \p{...}.

The exceptions are alnum, digit, punct and xdigit, whose definitions are different from those of Unicode.

[[:alnum:]] is equivalent to \p{posix_alnum}.

[[:digit:]] is equivalent to \p{posix_digit}.

[[:punct:]] is equivalent to \p{posix_punct}.

[[:xdigit:]] is equivalent to \p{posix_xdigit}.

Search anchor \G

A search anchor has been added. It matches at the position where each search started/continued and can be used for contiguous matches or in negative variable-length lookbehinds to limit how far back the lookbehind goes:

>>> regex.findall(r"\w{2}", "abcd ef")
['ab', 'cd', 'ef']
>>> regex.findall(r"\G\w{2}", "abcd ef")
['ab', 'cd']
  • The search starts at position 0 and matches ‘ab’.

  • The search continues at position 2 and matches ‘cd’.

  • The search continues at position 4 and fails to match any letters.

  • The anchor stops the search start position from being advanced, so there are no more results.

Reverse searching

Searches can also work backwards:

>>> regex.findall(r".", "abc")
['a', 'b', 'c']
>>> regex.findall(r"(?r).", "abc")
['c', 'b', 'a']

Note that the result of a reverse search is not necessarily the reverse of a forward search:

>>> regex.findall(r"..", "abcde")
['ab', 'cd']
>>> regex.findall(r"(?r)..", "abcde")
['de', 'bc']

Matching a single grapheme \X

The grapheme matcher is supported. It conforms to the Unicode specification at http://www.unicode.org/reports/tr29/.

Branch reset (?|...|...)

Group numbers will be reused across the alternatives, but groups with different names will have different group numbers.

>>> regex.match(r"(?|(first)|(second))", "first").groups()
('first',)
>>> regex.match(r"(?|(first)|(second))", "second").groups()
('second',)

Note that there is only one group.

Default Unicode word boundary

The WORD flag changes the definition of a ‘word boundary’ to that of a default Unicode word boundary. This applies to \b and \B.

Timeout

The matching methods and functions support timeouts. The timeout (in seconds) applies to the entire operation:

>>> from time import sleep
>>>
>>> def fast_replace(m):
...     return 'X'
...
>>> def slow_replace(m):
...     sleep(0.5)
...     return 'X'
...
>>> regex.sub(r'[a-z]', fast_replace, 'abcde', timeout=2)
'XXXXX'
>>> regex.sub(r'[a-z]', slow_replace, 'abcde', timeout=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python310\lib\site-packages\regex\regex.py", line 278, in sub
    return pat.sub(repl, string, count, pos, endpos, concurrent, timeout)
TimeoutError: regex timed out

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

regex-2024.4.28.tar.gz (394.8 kB view details)

Uploaded Source

Built Distributions

regex-2024.4.28-cp312-cp312-win_amd64.whl (268.5 kB view details)

Uploaded CPython 3.12 Windows x86-64

regex-2024.4.28-cp312-cp312-win32.whl (257.6 kB view details)

Uploaded CPython 3.12 Windows x86

regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl (759.9 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ x86-64

regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl (779.5 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ s390x

regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl (775.3 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ ppc64le

regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl (742.6 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ i686

regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl (751.4 kB view details)

Uploaded CPython 3.12 musllinux: musl 1.1+ ARM64

regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (789.3 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (815.0 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (829.6 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (786.1 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (777.1 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl (278.5 kB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl (282.4 kB view details)

Uploaded CPython 3.12 macOS 10.9+ x86-64

regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl (470.7 kB view details)

Uploaded CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

regex-2024.4.28-cp311-cp311-win_amd64.whl (269.0 kB view details)

Uploaded CPython 3.11 Windows x86-64

regex-2024.4.28-cp311-cp311-win32.whl (257.1 kB view details)

Uploaded CPython 3.11 Windows x86

regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl (753.1 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl (776.4 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ s390x

regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl (770.6 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ ppc64le

regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl (738.5 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl (750.1 kB view details)

Uploaded CPython 3.11 musllinux: musl 1.1+ ARM64

regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (785.2 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (810.3 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (823.6 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (784.0 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (772.9 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl (278.3 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl (281.7 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl (469.7 kB view details)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

regex-2024.4.28-cp310-cp310-win_amd64.whl (269.0 kB view details)

Uploaded CPython 3.10 Windows x86-64

regex-2024.4.28-cp310-cp310-win32.whl (257.1 kB view details)

Uploaded CPython 3.10 Windows x86

regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl (744.8 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl (768.7 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ s390x

regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl (764.2 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ ppc64le

regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl (731.5 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl (744.0 kB view details)

Uploaded CPython 3.10 musllinux: musl 1.1+ ARM64

regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (774.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (800.6 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (815.0 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (774.2 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (690.5 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (763.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl (278.3 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl (281.7 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl (469.7 kB view details)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

regex-2024.4.28-cp39-cp39-win_amd64.whl (269.0 kB view details)

Uploaded CPython 3.9 Windows x86-64

regex-2024.4.28-cp39-cp39-win32.whl (257.2 kB view details)

Uploaded CPython 3.9 Windows x86

regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl (744.6 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl (768.2 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ s390x

regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl (763.6 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ ppc64le

regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl (730.8 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl (743.8 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ ARM64

regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (773.5 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl (799.6 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ s390x

regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (814.5 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ppc64le

regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (773.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (689.9 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (762.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl (278.3 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl (281.7 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl (469.7 kB view details)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

regex-2024.4.28-cp38-cp38-win_amd64.whl (269.0 kB view details)

Uploaded CPython 3.8 Windows x86-64

regex-2024.4.28-cp38-cp38-win32.whl (257.1 kB view details)

Uploaded CPython 3.8 Windows x86

regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl (752.5 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl (771.3 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ s390x

regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl (769.2 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ ppc64le

regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl (738.2 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl (748.6 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ ARM64

regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (777.1 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl (802.5 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ s390x

regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (818.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ppc64le

regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (777.0 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (695.9 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64 manylinux: glibc 2.5+ x86-64

regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (764.6 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl (278.3 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl (281.8 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl (469.8 kB view details)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file regex-2024.4.28.tar.gz.

File metadata

  • Download URL: regex-2024.4.28.tar.gz
  • Upload date:
  • Size: 394.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for regex-2024.4.28.tar.gz
Algorithm Hash digest
SHA256 83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4
MD5 543f5cb066ee5f4a3c02573b265ef32d
BLAKE2b-256 c0d687709afa2a195ea902810dfaa796d21dd45d91b496dc98828073acbfe5af

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82
MD5 5ee73549418acc5d7f77a6802fe4fdce
BLAKE2b-256 230811cafae51a5f608fd134adebf5f7d19bf0af3b2b0cad6086b56116c1e9e3

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-win32.whl.

File metadata

  • Download URL: regex-2024.4.28-cp312-cp312-win32.whl
  • Upload date:
  • Size: 257.6 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for regex-2024.4.28-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17
MD5 942b6db51278d456f2626ad5d2667a0b
BLAKE2b-256 e4367ca645b72049ccf94bed27b0bb74643a6c16f1bfb012cec8cd443418fe83

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6
MD5 4b09dfd076dbe602feba3b1c7e4be336
BLAKE2b-256 1de99b550ba80c4f4d5692e160060e61329e55197f39028e0cb9f566727b9e62

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl
Algorithm Hash digest
SHA256 144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d
MD5 2146a137c47f76cd2c3b5eaf8f46d6f7
BLAKE2b-256 9d39f705381224c9d05ecbcdcd69aa1f2b3cb216f255128a482ce7d1f95de3a9

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl
Algorithm Hash digest
SHA256 ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0
MD5 94d6066364f216cfbf5f91b7856a2b85
BLAKE2b-256 f97da597fc4c9e831f87fd2dc0700e32796d362a1230cb4f8231c9410cdd42a9

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f
MD5 00a2f4e04e76abbe90909f53a8ac16b3
BLAKE2b-256 819a10a63196843cedf70147040d3a115605f57431dc0d160fb0b7ff1db5ef8c

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd
MD5 55e2be4ded384e2cc0f1487c41a8b69a
BLAKE2b-256 f35b2f53618f30594ee21379eeccc66dbada4749ce95d1af23db937aa1fb38fe

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c
MD5 f67d9d02f1b1d63037fae3e5c6a80762
BLAKE2b-256 42b2a707133b52fa8e77ea89feef5d22cba1828ed1d09f92afdb9e388a979815

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc
MD5 f6d76adfe0e8a2bbc1d9268ef5c92052
BLAKE2b-256 fc47667123075845bdb331e19bc76d1f51d1617e3e1daf19230810cbeaa491d1

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662
MD5 f184ddf0dfe2bf3b2b25d6945164c6c2
BLAKE2b-256 1b52c5f269dacd4e877e064e32cebd9f89e6f5604bc6979d095cef22e2c2750b

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013
MD5 fe95812eac4ae06892a205dfa72adb96
BLAKE2b-256 95d037b1b2330211689b1ed87dfcc1c63d6452d0771c46df36ba207676e2928f

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833
MD5 7f00f8085ddea5a4b77516423b509a2f
BLAKE2b-256 7efeeb28567569d57d63293152097dd16111a9b0bd052019521e3b7e73ba5d42

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0
MD5 8d0803cc17fb207ebd5aa5c119f90d09
BLAKE2b-256 2f09c01e03fae1cf33e4db0973e7ccb861fc529eb20168c7582e9fbe5a84426f

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae
MD5 e0d293b7caf1543d5377c45ebf4cb912
BLAKE2b-256 49042499276107a6c585c544e91fc7d711b5c848a68c602bee88317a455715bf

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5
MD5 4091b086449b796474a21c0ffe9bf13f
BLAKE2b-256 679774b5acb641c81ab69c32ec28c40c1918cb3e7f4b0fc2356a3c20a3751714

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90
MD5 2ccc40d58db2df28771daafd6f81033f
BLAKE2b-256 bdad33a844d35d3be70e01743f27960cf3646da1dbdea050e67dbdae6b843582

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-win32.whl.

File metadata

  • Download URL: regex-2024.4.28-cp311-cp311-win32.whl
  • Upload date:
  • Size: 257.1 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for regex-2024.4.28-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630
MD5 9f4ddd1be5332826d1ae2331b923ad2e
BLAKE2b-256 f2a5982d0285de038aba9de7dd4e2696f8d9870c163f18fbe6ce8032c5473c88

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f
MD5 4a745e29f7689c007a53bb74453500ea
BLAKE2b-256 1b185a9eac44ca44711667094d720a5feb4a52a9f5d5bf571906b7d34751c133

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl
Algorithm Hash digest
SHA256 0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf
MD5 3e000ffbbf1bd23a9cd3ef5d8596b513
BLAKE2b-256 eede87df38f8a6a81845e977a25f91b84284d620641aa4de0f79915f14cd2e1f

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl
Algorithm Hash digest
SHA256 499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257
MD5 22dffa3db6455a5b633a3a7a5fa24f4c
BLAKE2b-256 55f483085e20d6bf69e05eb6c88ff40e8922fa75a0c1d205a1905f9250716600

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a
MD5 7f72bba1658a48071ad382ff6de0ea5b
BLAKE2b-256 79db013a00cf9a98f4be0b292770e136c577ba4cee7b926801ea46db52647ca2

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b
MD5 8e28aa9cc7771e55d14f3598334ca306
BLAKE2b-256 72c7fd8caf0c54d5e2d0d80b5b98cb8c7d6127f3ca73cc182b7f4828b7b97317

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb
MD5 f99535429735a4ee3366ea5a46dd8652
BLAKE2b-256 522122e993e8151c94e9adc9fc5f09848bad538d12c6390cec91f0fb1f6c8ba3

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec
MD5 a5c063e6f525e076e46aa19b442e4913
BLAKE2b-256 71fc40e47a420c60d85625a6eacb05ca8a3dac82e031cf3c3cde1202d006a52d

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a
MD5 2aff9774aab22b9725df5e745b3ac9bb
BLAKE2b-256 38c6a4045000fed17988b3bb667663ac71c79870272cd235ad7cb19ddb102520

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6
MD5 2cecc3bdb3ba816b4ff2430433d72fbe
BLAKE2b-256 60056bd4b4c5a7d1a9f474527f4990bbdb0d8ec7d2b052bddb95b2f52c768ab4

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636
MD5 d63013c136609c21bec020aa193d9871
BLAKE2b-256 f3e626cd39158e79ff6a72ceb8d4ac3423d76680936f60ab1818007a15177f8d

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3
MD5 cd8906680b25709099fde528e7137dac
BLAKE2b-256 ac868a1f52664cc21effdd7a0d6a142ffce39f5533be418e5b26d75137f2921b

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb
MD5 3a24d17132d9b158f9d2353cbb28c4ff
BLAKE2b-256 9e4b950828d604c44c17468a992940c68c40a92dd5dc85e4415dc30f82535b2c

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796
MD5 b7d1d1ba2cba2fc6c56fdec1b7801a44
BLAKE2b-256 809da4f1478da769758d55edcbd820eeaf735855a01cabfd132af1676674a843

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1
MD5 fbf35824f6fc0f507a9edd811e9c9f5b
BLAKE2b-256 2a53a0ea6e7b8b9a574f7adb47b3a2c65fdc35d1aa1d4cd28dc9b40799a519d4

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-win32.whl.

File metadata

  • Download URL: regex-2024.4.28-cp310-cp310-win32.whl
  • Upload date:
  • Size: 257.1 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for regex-2024.4.28-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d
MD5 b7c1c3cee04c85c05bbaacf726aab36e
BLAKE2b-256 bc706f1f43068b1318bc87f1d0e8d2fe4b12cfc90326837a64d7ff551c524039

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea
MD5 71cf591650074ce547450bf2a2330153
BLAKE2b-256 ab0451f63d180ce3884c6f4e1a237004ccce6ed485ce80589a52566013923cc0

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl
Algorithm Hash digest
SHA256 e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8
MD5 b1acc0069ff62a0c91a34148c7771384
BLAKE2b-256 0d28c77a47d5d9006dccba0603225fdcc7880aae74ed04eba5cdd3a7ab218363

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl
Algorithm Hash digest
SHA256 fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e
MD5 75c9f170e5a31cdeb0efe636243959a4
BLAKE2b-256 6e672c2e5751e33af3f637d4b42e9e3e1d6529571adc0ce4ec9bfc0e39bd9f2b

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db
MD5 e803af0d209b493f542e0460716228f1
BLAKE2b-256 631f4ea65d163d8765a78cb594183152ead4251134dd01dc18766232ffebdcab

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3
MD5 350b9871c9c959fc5aab094cbc353885
BLAKE2b-256 5c65e5303813c43385272db2aacc319fa2ec4a32eb4ed02c1ee0fb44f9f75546

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31
MD5 588f1b5a543a4c490b4bddbc96e43082
BLAKE2b-256 89670176d9c866e74f803e0492f076aa3ccde13c6b4e37efa08d608e03f61b97

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a
MD5 b41775173dceec572fa6ca4f783d6581
BLAKE2b-256 40b98fa44fa81251862fd6eb6595247e2cfa83136f690f8a2b9da4224ef6dcc0

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7
MD5 388c0fd9c28aa87cfa7abf977d4a740c
BLAKE2b-256 ea937fb736913787529089481df2d96c3c5d77c71e90af1efdc2fccf77847a19

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f
MD5 a0621663b20f8b140ccade9a038f472b
BLAKE2b-256 f0284c475b926bf552802654b7735c2773152adcc2cdcd86211a5cccfe87a4d2

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10
MD5 ce173f1657490297feec8ea862eaaf3d
BLAKE2b-256 d2e962c146f8c27f4bd80458ef757bb8fdd03c4729e12b10fe670add8503b662

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c
MD5 dd0abb72b42ec12a316068c77b23301d
BLAKE2b-256 405225d8d70e2737eca5fd16ea82849f596070395c65f28690db8474fe14be4e

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6
MD5 254f4069ac664022bfafa0d21d5e8f4c
BLAKE2b-256 3e500bdc9ec73b669dd53bdc1c61ebcb35febad5ba009f1ced93e924d756478c

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f
MD5 c8cef47cab5fa968cd0c1f02bab74115
BLAKE2b-256 97a1241a5008b01c7816918d3179e37421c3f8c6b809de66c3ec509982bc32c1

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61
MD5 3d082f4a1c4b475f5138d637baa5681f
BLAKE2b-256 cdf03df8e9729dd23843772d99646314bf7956cce5c8715dfb372c2c075c18e3

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: regex-2024.4.28-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 269.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for regex-2024.4.28-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962
MD5 9aa728c8ce772d3eac00777930585564
BLAKE2b-256 37f301719ccda3282cb1d1d02d8dd6263454baccce8a313b810fa65cd18653f6

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-win32.whl.

File metadata

  • Download URL: regex-2024.4.28-cp39-cp39-win32.whl
  • Upload date:
  • Size: 257.2 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for regex-2024.4.28-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc
MD5 7616a678b3eaad2063f9a6cd8d3bfe12
BLAKE2b-256 ee2030bb46ab7ec280189daa08d28fbdce8163d7b9ba5d9c26432b9ddabb0020

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1
MD5 48c731182bfa9188b8db09ad947dc529
BLAKE2b-256 8e72264dc147acc5ce1eacc021ff9f2915f7b6b4d8b6c58adc8097a868fd62b6

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl
Algorithm Hash digest
SHA256 b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a
MD5 e27756b8368a4695298fbd47ca3f77b0
BLAKE2b-256 b582a3592064f497422020d05ec0fbd0a09fae08ee0ecf2976664258afc66f51

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl
Algorithm Hash digest
SHA256 99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc
MD5 9c1ab97e88b92c2f2c63250060cf0e82
BLAKE2b-256 c560c55d4d6fefe733909233d13658fcab8ed306f696114df983cd68bdb858d2

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f
MD5 03ba157a9192700c4e5bc8b4b6ed484d
BLAKE2b-256 1c6dc6eedba1052d6ebbc63675da0e7d9d7c640d8f3242f7865ea151d136e120

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d
MD5 6f6a70be7fddbd7c54c66258bc1fa4d8
BLAKE2b-256 c07ed19708db4790b0f9c733fdf595a275549338f6a23dd8adea9fe212af0959

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b
MD5 055fbab95dbb589b43944435eafa82b7
BLAKE2b-256 f7aedb5195107d04272b4e8808640fb4f88dc60f1419795aa846bf3ed9fce63d

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e
MD5 635613bed73ad11795459e5c468ee521
BLAKE2b-256 aaff67db7f7a6f8d8075c95b6699ec600067457bdef77c9f1207ac280bde7d7d

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947
MD5 356fd72cd377853e0fa3370f2d72bce0
BLAKE2b-256 263f31fef80524ff77740dd076ca898c0a8d602591b99748479ecdcfa565cb79

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1
MD5 9c533197835d37f6fb2948e195f97eda
BLAKE2b-256 119a14559385bf4167d32acd879b26cc53f3e665b3e44f78c051c9743651f2d4

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26
MD5 ea63d689f47c29ff5aa6114412d8a027
BLAKE2b-256 b41232bf57276e5e7e05b0e11283a999a7ee5b77a69335f0313e21cbdafa2f52

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2
MD5 24fd68af5904825a26e9735b06f51758
BLAKE2b-256 12135a5899729eaa16bdba11b663b5d78dfabbd29adae661ccb428aaf8e8c263

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1
MD5 9b6377c12b16f8ad627a55a79d39db78
BLAKE2b-256 4948e3c26721f4f3565f41c62af73c0d65624ea18fe21847e4fe605bbe4aed4d

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae
MD5 983183b769517f37273129651ff3a0f3
BLAKE2b-256 6b3d04e3b530f7ca370a7223fd62c53b0f59e3c2ed3a53723f8ed27cba3cb4b4

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b
MD5 2a8b3b92e4303652c30c38f4448382b0
BLAKE2b-256 a182171b20582a7aa1292139c206def8204c62852ab1e800d12c79c79db13695

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: regex-2024.4.28-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 269.0 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for regex-2024.4.28-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c
MD5 5af7011c9452adf8992a38a6ef79a29e
BLAKE2b-256 3de87a8eca2195fae64871e2678a1522a83515dec7660f6046dec7449b5dab39

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-win32.whl.

File metadata

  • Download URL: regex-2024.4.28-cp38-cp38-win32.whl
  • Upload date:
  • Size: 257.1 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for regex-2024.4.28-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58
MD5 5ea679fed1c8c7d4ec171e6551c92c1c
BLAKE2b-256 f827738886e65c214e05c9ed8317d2c858dca36c10eaa1b01fa0ca4fba6ec243

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150
MD5 c6500b469bffe3c8f860903e428604e3
BLAKE2b-256 20c4190128e039bdc0e21d8d63b50ead2be16aa0b271da435c7b13328877098a

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl
Algorithm Hash digest
SHA256 5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e
MD5 5e3de3d1d66fd98e8f3da9e4d672bd84
BLAKE2b-256 a02a5f0f5331d9eba3baa30dfc0a491f308ebf9c670d9e9a125024f90bf6a8fb

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl
Algorithm Hash digest
SHA256 7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02
MD5 97db13632b2e3033aec95bbe6ef13f04
BLAKE2b-256 8a6255144a63d9da33420fabdd4a948b53e707ab9e76eee5c9e4ecfbd330683e

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e
MD5 7be4c1cc3f070c4fd14ed264a177b9ee
BLAKE2b-256 8f56c248b191417080b46e7da5cf38cedd04e1fad46731421e8c881b9e30e9c4

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4
MD5 195ac384173b5fe77dc531ab57a40581
BLAKE2b-256 c46c994ae6c984a51571fce80cd992b5544c4f970d2d39250c9adaed93237f22

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397
MD5 43e46ebcaeaa720ef1efecd56bc2abbe
BLAKE2b-256 393f5fa3298204712d39e2c4e21bc7c45754e6b0386163da9157997ae47c2333

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b
MD5 a67df710077ec06872c7c9a6be181e97
BLAKE2b-256 9faee39a10d491f15f2a02327d98a71a1289d615101114e94fc285cb77bdb267

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185
MD5 33ade387ee06131d39dedaa631724f46
BLAKE2b-256 e5851b9e820c2f9d212983373aaf8b9aae33077c51329de0b99e3dd64bd75663

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1
MD5 c45c342bd8a737145191c375468f88f6
BLAKE2b-256 d19959f0a9f875070bff0b81882abed40405de40d8003dee07f3ef7d28575e2e

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925
MD5 ff5556ca6a1cc3ae71901335c810c85c
BLAKE2b-256 c28347732275de942b5abb4c57826ea84836c4b041bcb0fb14ba5f8558c8a150

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94
MD5 f2588fbbc4f2ee1209f4abea04bf067e
BLAKE2b-256 2d760a94b8023e848862b891fb2e39c98e74bc6590fef58b78631cae3d4ed862

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247
MD5 c4babbeaf85a90ecdf11417700a4dda0
BLAKE2b-256 02b6e501b7bce009e64cba2e9489fa1fc31b6dc82e4ee040d9124f5887fd8bdc

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666
MD5 eab071ebd66f0996edd6b2fa36084834
BLAKE2b-256 7c5c82170fd72c4ec4a74dff3471e435d8f0a34fb2d210f6c9b8e290a9b8f1a3

See more details on using hashes here.

File details

Details for the file regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6
MD5 0621f5ce60d9ce8280d23c11f2807fa0
BLAKE2b-256 35505a0a87a535d0018142e8c3b80f27c23b0cac211a6d095f0161524ba007a9

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page