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

Ao utilizar expressões regulares em Python, 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.

Elcio: Elcio é sócio fundador da Visie Padrões Web. Pioneiro no uso e divulgação dos padrões do W3C no Brasil, Elcio já treinou equipes de dezenas de empresas como Globo.com, Terra, Petrobras, iG e Locaweb. Além disso, tem dirigido as equipes da Visie no desenvolvimento de projetos web para marcas como Brastemp, Itaú Unibanco, Johnson & Johnson e Rede Globo.

View Comments (6)

  • Preciso do código fonte de um programa, pode ser em python, que permita ao usuário digitar um expressâo regular e depois digitar a palavra. No final o programa deve dizer se a palavra foi reconhecida ou não.

    tem como me ajudar

  • tenta isso:

    dudu ="O cão está com você."
    print dudu
    dede= dudu.decode('iso8859-1')#converte
    print dede
    dudu = dede.encode('iso8859-1')#desconverte #'utf-8'
    print dudu

  • 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 ;)

  • 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

  • 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 ?

  • 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. :)