... comprobar si es alfanumérico y posiblemente contiene un carácter de subrayado.
¿Te refieres a esto literalmente, de modo que solo se permite un guión bajo, total? (No es irracional para los nombres de los jugadores, los subrayados adyacentes en particular pueden ser difíciles de leer para otros jugadores). ¿No debería coincidir "a_b_c"?
Si es así:
if playerName and re.match("^[a-zA-Z0-9]*_?[a-zA-Z0-9]*$", playerName):
La nueva primera parte de la condición cheques por un valor vacío, lo que simplifica la expresión regular.
Esto no tiene restricciones sobre dónde puede aparecer el guión bajo, por lo que todos los "_a", "a_" y "_" coincidirán. Si por el contrario desea evitar que ambos anterior y posterior guiones, lo que es más razonable para nombres de los jugadores, cambiar a:
if re.match("^[a-zA-Z0-9]+(?:_[a-zA-Z0-9]+)?$", playerName):
// this regex doesn't match an empty string, so that check is unneeded
¿Qué pasa si LOCALE o Unicode se especifican? – interstar
No se ha comprobado, pero debe coincidir con los caracteres alfanuméricos de la configuración regional especificada. – Rozuur