La plupart des caractères sont reconnus comme tels dans une expression rationnelle.
Les métacaractères, qui signifient autres choses qu'eux mêmes, sont les suivants :
. ^ \$ * + ? { [ ] \ | ( )
Ils servent à définir un ensemble de caractères. Par exemple, [abc] signifie « a, ou b, ou c».
On peut utiliser le tiret - pour étendre l'ensemble. Ainsi, [c-g] signifie « les lettres minuscules de c à g », quand [a-z], [0-9] veulent respectivement dire « les lettres minuscules » et « les chiffres ».
À l'intérieur de crochets, la plupart des métacaractères perdent leur sens. Par exemple, [akm*] reconnaîtra a, k, m, ou * : l'étoile ne signifie pas ici « un nombre quelconque ».
Le métacaractère ^ joue un rôle différent de celui qui est habituellement le sien, quand il est dans des crochets. Il joue le rôle de complémentaire d'ensemble : [^5] signifie « tout caractère qui n'est pas 5 ».
Le backslash \ permet d'échaper les métacaractères :
D'autres part, certaines séquences spéciales commencent par le caractère backslash :
On peut insérer ces séquences au sein de classes (entre crochet). Par exemple, [\s,.] signifie « tout espace, ou une virgule, ou un point ».
Le point . est un métacaractère dont le sens signifie :
« tout caractère qui n'est pas un \n ».
Un mode alternatif existe (re.DOTALL), dans lequel . signifie « tout caractère ».