There's nothing special with _xxx modules except they are private (e.g. _abcoll) or low-level (e.g. _thread) and not intended to be used in general.
The _ast module is special, e.g.
$ touch _ast.py
$ python -c 'from _ast import *; print(dir())'
['AST', 'Add', 'And', 'Assert', 'Assign', 'Attribute ...
But this is not because of the leading _, but that _ast is a built-in module. Similar thing happens with the sys module.
$ touch sys.py
$ python -c 'from sys import *; print(dir())'
['__builtins__', '__doc__', '__name__', '__package__', 'api_version', 'argv', ...
In Python _ast and ast are two separate modules. There is a line
from _ast import *
in the built-in ast.py, so importing ast will also bring everything from the _ast module in. This gives you the illusion that _ast and ast have the same content, but actually _ast is a lower level module of ast.