Sites e sistemas rápidos, acessíveis, bem posicionados no Google e, o que é mais importante, fáceis de usar.

Acentuação em Português e Expressões Regulares Python




Ao utilizar expressões regulares em Python[bb], por padrão, seu texto é interpretado como uma seqüência de caracteres ASCII comum. Assim, caracteres acentuados são considerados sinais gráficos especiais, e não são capturados como letras. Veja este exemplo:


>>> import re
>>> print re.sub(r"\b","|","era uma criança")
|era| |uma| |crian|ç|a|

Como você pode ver, o ce-cedilha não é considerado uma letra, "quebrando" a palavra. Resolver isso é muito fácil, basta compilar a expressão regular passando a flag L, para que ela siga o locale de sua máquina, ou a flag U, para que ela trabalhe com unicode. No meu caso, em que o locale da máquina é unicode, tanto faz. Veja como funciona:


>>> import re
>>> c=re.compile(r"\b",re.U)
>>> print c.sub("|",u"era uma criança")
|era| |uma| |criança|

Só não se esqueça de trabalhar com strings unicode.

Adicionar esta notícia no Linkk

4 comentários para “Acentuação em Português e Expressões Regulares Python”

  1. Jader Rubini Says:

    Uma vez eu quis fazer uma função Python pra reescritas de url's, da mesma forma que o Wordpress faz. Depois de ler este tutorial, a solução que eu encontrei foi:

    def urlize(str):
    url = unicode(str, 'latin-1')
    url = unicodedata.normalize('NFKD', url).encode('ascii', 'ignore')
    url = re.sub(r'[^\w\d-]', '', url.replace(' ', '-').replace('--', '').lower())
    return url

    Não sei se esta seria a melhor forma e fazer isso, mas foi o jeito que eu achei. :)

  2. DGmike Says:

    Legal, Elcio…
    duas perguntas,
    - tem como definir isso em algum arquivo de configuração para ser padrão?
    - podemos fazer isto:
    re = re.compile (r"\b", re.U)

    para não prescisar chamar o c.sub e sim o re.sub ?

  3. d3rf Says:

    Assim dando uma olhada do nada me veio a idéia …
    Sou programador, sou uma anta em design … Você é programador, conhece bem design, é apaixonado por Python como já ouvi numa palestra, pq vc não migra um pouco para Java (J2ME), e começa a produzir coisas boas para PDAS, Smartphones, e MicroEditionMachine em afins …?
    meu blog: http://d3rf.wordpress.com

  4. Daniel Luz Says:

    DGmike, acho que não dá pra tornar isso padrão. Mas quanto à segunda pergunta, você pode prefixar as expressões com "(?u)". Por exemplo: r"(?u)\b". Espero que ajude ;)

Deixe um comentário