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.

6 comments on “Acentuação em Português e Expressões Regulares Python

  1. Daniel disse:

    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

  2. west disse:

    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

  3. Daniel Luz disse:

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

  4. d3rf disse:

    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

  5. DGmike disse:

    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 ?

  6. Jader Rubini disse:

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

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>