Hone

Lessons · Regex · matching bytes rather than text

Bytes are not text

A bytes pattern matches bytes and a str pattern matches str; re refuses to mix them, and in bytes mode \w is ASCII-only.

Hone is a place to practise programming. This is one of its lessons, written out in full and free to read without an account.

What it is for

Framing a protocol, or finding a marker in a file you would rather not decode. Both are real, and both are about bytes.

How to think about it

If the question is about words a person wrote, decode first. If it is about the bytes on the wire, keep them bytes and write rb'...'.

Worked example

re.findall(rb'\w+', 'caf\xe9'.encode())
In bytes mode there is no Unicode to consult.
re.findall(r'\w+', 'caf\xe9')
Decoded first, the answer is about characters.
isinstance(re.findall(rb'\w+', b'ab')[0], bytes)
What comes back matches what went in.

Your turn

Match words in a bytes value.

re.findall('\w+', 'caf\xe9'.encode())

The trap

Mixing them raises TypeError rather than guessing an encoding. That refusal is the feature.

Next in Regex

Every Regex lesson on one page

Practise matching bytes rather than text on HoneA question on it now, a coding challenge where there is one, and it is remembered for review. Free, no email needed.