Geovane, acho que você acabou se confundindo um pouco com os metacaracteres, então vou fazer um resuminho dos que podem ser úteis nesse seu caso (sempre bom lembrar!):
Na primeira expressão, você especifica que quer encontrar um #
que esteja no começo de uma linha (^#
) e depois usa o +
. O +
, entretanto, nada mais é do que um metacaractere tipo quantificador, ou seja, do tipo que não controla o conteúdo, mas sim a quantidade em que ele aparece. Este metacaractere específico especifica que o caractere que o precede (no caso, #
) deve aparecer pelo menos uma vez para dar match, mas que pode aparecer mais (e essas aparições extras também entrarão na match). Você pode até testar:
>>> resultado = re.match(r'^#+','#comentarios comecam com tralha')
>>> resultado.group()
'#'
>>> resultado = re.match(r'^#+','#####comentarios comecam com tralha')
>>> resultado.group()
'#####'
Bem, mas isso acaba não sendo muito útil para nosso objetivo, afinal não queremos pegar vários #
iguais, queremos pegar tudo, contanto que comece com um #
! Aí entra o ponto (.
). Ele, diferentemente do +
, não é um metacaractere tipo quantificador, mas sim do tipo representante. Ou seja, do tipo cuja função é representar algum caractere, casando a posição desse caractere uma única vez. O ponto, em específico, é um metacaractere solitário, necessitado - casa com qualquer caractere. Então nessa sua segunda expressão, o que você fez foi pedir qualquer match que começasse com... qualquer coisa (^.
)! Testes também são bem vindos aqui:
>>> resultado = re.match(r'^.','#comentarios comecam com tralha')
>>> resultado.group()
'#'
>>> resultado = re.match(r'^.','Y#comentarios comecam com tralha')
>>> resultado.group()
'Y'
O que você pode fazer para resolver sua questão é justamente utilizar esses dois tipos de metacaracteres (quantificador e representante) em conjunto! Usando os que você mesmo usou, que tal definirmos que queremos tudo que comece com #
, mas que depois pode ter qualquer coisa em qualquer quantidade (contanto que algum caractere desse antro da qualquer coisa apareça pelo menos uma vez¹), formando uma espécie de curinga? Então vamos lá:
>>> resultado = re.match(r'^#.+', '#comentarios comecam com tralha')
>>> resultado.group()
'#comentarios comecam com tralha'
E agora funciona perfeitamente!
¹ Caso você queira que a match não seja limitada pela necessidade que o +
impõe de haver pelo menos um caractere sucedendo o #
, pode usar o metacaractere (também do tipo quantificador) *
. O asterisco faz o mesmo trabalho que o +
, mas sem essa exigência de aparição de pelo menos uma vez. Exemplificando, para ficar mais claro:
>>> resultado = re.match(r'^#.+', '#')
>>> resultado == None
>>> True
>>> resultado = re.match(r'^#.*', '#')
>>> resultado == None
>>> False
>>> resultado.group()
>>> '#'
O ponto utilizado em conjunto ao asterisco forma o curinga tradicional, bastante utilizado no mundo das expressões regulares. Apesar de ser bastante prático, ele pode ser um problema, já que casa com tudo, com nada, com qualquer coisa! Já que na maior parte das vezes não queremos realmente casar com qualquer coisa, o uso desse curinga (e do que usamos anteriormente) é algo a se tentar evitar. No seu caso não tem problema, já que é algo direto e já esperado, não vem de um input do usuário, por exemplo.
Espero que tenha dado para entender tudo! Abraços!