Aqui não precisamos nos preocupar com código HTML inválido, não precisamos nos preocupar com aba aberta sem fechar, vivemos no mais puro paraíso. Com isso, o que precisamos fazer é só substituir os underlines por tags itálico e os asteriscos por tags negrito, guardando em uma variável se já abrimos uma tag dessas antes ou não. Essa variável é consultada antes de colocarmos a tag e o valor dela troca sempre após colocarmos a tag apropriada.
Um detalhe interessante para as linguagens JavaScript e Python é que eu não uso o replace indiscriminadamente porque alguns dos underlines abrem e outros fecham, mesma coisa para os asteriscos, então precisa-se trocar com certo critério.