your code is much more readable than a list comprehension, but let's walk through it
the typical syntax is something like this
[expression(item) for item in list if condition]
this will return a list, if you don't assign the list comp to a variable then it will just perform the expression len(list) times once for ever item in the list. the if statement is optional. knowing this let's change your code up a little bit, you can see the hard part is getting the inner loop done, so let's do that first
for module in host.modules:
removed_modules = [module for removal in removal_re if re.compile(removal).match(module.name)]
ok so that's already not pep 8 compliant because it's too long but for the sake of argument you can see we made a list of removed modules and we're looping through the modules in host.modules doing this over and over.
this means that what's under this new for loop can become the expression we talked about earlier, and the module can become the item and we end up with this
[[module for removal in removal_re if re.compile(removal).match(module.name)] for module in host.modules]
hey presto a one liner but just remember, just because you can do something doesn't mean that you should!
Simple is better than complex.