Física Computacional - FSC-5705

só um divisor

Strings e expressões regulares em Python

Para escrever uma string basta colocar o que se deseja entre aspas simples ou duplas, aspas triplas são utilizadas para definir um bloco (um paragrafo). Além das string temos as sequências:

Em relação à conversão de unicode (por exemplo UTF-8) para latin o python disponibiliza o comando unicode() que converte de "normal" para unicode e str(), que converte de unicode para normal.

Como em todas as linguagens, strings são vetores chamados de imutáveis, consequentemente cada letra (tudo entre aspas é uma letra), é um elemento desse vetor. O vetor iniciam em 0 e vão até $n-1$. É possível pesquisar o tamanho de uma string utilizando a função len()

            #!/usr/bin/env python

            a = ( raw_input("Por favor, digite algo:\n") )

            print "voce digitou: %0s" % a
            print "que tem um comprimento de %d" % len(a)
            print "o primeiro carater eh: %c" % a[0]
            print "o ultimo carater eh: %c" % a[-1]
            b = len(a) / 2
            print "o carater do meio eh: %c" % a[b]

            parte = a.split()
            print 'tem %d palavras' % len(parte)
            print "o primeiro palavra eh: %s" % parte[0]
            print "a ultimo palavra eh: %s" % parte[-1]
          

O python disponibiliza uma serie de funções que atuam sobre as string como o count do exemplo embaixo. É importante conhecer alguns deles pois devemos lembrar que tudo o que o python lé como arquivo é uma string (via raw_input, input, open ou ate mesmo utilizando o módulo sys), assim por exemplo, se você tem um arquivo de varias linhas e varias colunas você pode ler a linha, mas as colunas você separa usando split(). As funções disponíveis para tratar strings são muitas mas em geral as que a gente necessita para tratar nossos dados são poucas.

            #!/usr/bin/env python


            a = 'Para escrever uma string basta colocar o\
            que se deseja entre aspas simples ou duplas \
            aspas triplas sao utilizadas para definir um bloco'

            b = ( raw_input("Por favor, digite uma letra:\n") )
            c = a.count( b )
            print 'no texto:\n%s \na letra %s apareceu %d vezes' %\
            (a, b, c)
          

Mencionamos quando falamos sobre a formatação do print que podemos utilizar ela para formatar uma string como se mostra no próximo exemplo

            #!/usr/bin/env python

            import os    #modulo de acesso ao sistema operacional

            Rho     = 3.0
            Temp    = 0.543
            Semente = 1

            sRho     = '%06.2f' % Rho
            sTemp    = '%06.3f' % Temp
            sSemente = '%02d' % Semente

            file = 'dado_rho_' + sRho + '_temp_' + sTemp + '_seed_' + sSemente + '_.dat'
            print file, os.path.isfile(file)   #os.path.isfile checa se o arquivo
                                               #'file' existe
          

Expressões Regulares

Uma dos objetivos de se aprender python para auxiliar na pesquisa é utilizar só ele e esquecer o resto das funções existentes no Bash tipo grep, sed, awk, tail, head, etc., funções muito usadas na análise dos resultados. O módulo intrínseco de manipulação de strings faz muito desse trabalho contudo ele se complementa ainda mais com o uso de expressões regulares (existentes em grep, awk, sed, etc.). Não pretendo dar toda uma descrição de todas as funções regulares, mas só exemplificar alguns casos (e simultaneamente introduzir outros métodos do python) a fim de motivar à procurar por mais informação ao respeito

Uma expressão regular é um método formal de especificar um padrão de texto. Ou seja, são utilizados algumas para procurar por padrões em algum texto (string). Em python o módulo que da acesso às funções regulares é o re

Metacaratere significado
. casa qualquer caráter
[ ... ] lista de caráteres a serem casados (os pontos não fazem parte)
[ ^... ] lista de caráteres a não serem casados (os pontos não fazem parte)
? casa zero ou um caráter
* casa zero, um ou mais caráteres
+ casa um ou mais caráteres
{n,m} casa de n até m coisas, exemplo 5{1,3} casa: 5, 55, 555
^ casa no inicio, ex. ^a: abra, ala, ana, arpa, ...
$ casa no fim da linha, ex. $r: radar, camihnar, ...
\b casa no inicio ou fim da palavra
\c escape, transforma em litera o c, ex. \^: literal o ^, \.: literal o .
| ou, exemplo ^a|^b: ana, bola, aras, barca, ...
( ... ) casa o seguinte grupo, ex. (ba): aba, ambar, bah, ..
\1..\9 casa para atrás, ex.

Na tabela embaixo apresento as classes utilizadas para nos referirmos ao elementos sobre as quais podemos aplicar as expressões regulares, primeiramente as classes do tipo caráter

classe caráter significado
\c Control
\s Espaço em branco
\S Outro caráter diferente de espaço em branco
\d Dígitos, ex. 1, 2, 3, 4, ...
\D Outro caráter diferente de dígito
\w Caráter tipo letra - alfanumérico (letra e dígitos) e _, ex.
\W Qualquer caráter diferente do tipo letra
\x Carácter do tipo hexadecimal
\O Carácter do tipo octal

Tabela anterior na formatação POSIX

classe POSIX significado
[:upper:] letras maiúscula
[:lower:] letra minúsculas
[:alpha:] Todas as letras
[:alnum:] Dígitos e letras
[:digit:] Dígitos
[:xdigit:] Dígito hexadecimal
[:punct:] Carateres de pontuação
[:blank:] Espaço e tabulações
[:space:] Espaços
[:cntrl:] Caráter control
[:graph:] caráter imprimível
[:print:] Caráter imprimível e espaços
[:word:] dígitos, letras, "_" (underline)

Como exemplo vejamos o seguinte script python

            #!/usr/bin/env python

            import re    #modulo de expressões regulares

            file  = 'dado_rho_003.00_temp_00.543_seed_01_.dat'

            Parte =  re.split('\D\D+',file) #procura mais de um não dígitos 
                                            #contíguos
            print Parte