[Powered by Google Translate] [Seminário: Correspondência de padrão com expressões regulares]
[John Mussman-Harvard University]
[Isto é CS50.-CS50.TV]
Okay. Bem-vindos todos. Isto é CS50 2012.
Meu nome é João, e vou falar hoje sobre expressões regulares.
As expressões regulares é essencialmente uma ferramenta, mas também por vezes utilizado
em código ativamente para corresponder essencialmente padrões e cadeias.
Então aqui está uma história em quadrinhos web de xkcd.
Neste quadrinhos há um mistério de assassinato onde o assassino tem
seguido alguém em férias, e os protagonistas têm de
pesquisar através de 200 megabytes de e-mails à procura de um endereço.
E eles estão prestes a desistir quando alguém que conhece expressões regulares -
presumivelmente um super-herói - desce rapidamente e escreve algum código
e resolve o mistério do assassinato.
Assim, presumivelmente, que vai ser algo que você estará habilitado a fazer
após este seminário.
Nós apenas estamos indo para fornecer uma introdução concisa à linguagem
e dar-lhe o suficiente recursos para ir atrás de mais recursos em seu próprio país.
>> Assim, expressões regulares olhar basicamente assim.
Esta é uma expressão regular em Ruby.
Não é muito diferente entre as línguas.
Temos apenas em barras para começar e marcar a expressão regular em Ruby.
E esta é uma expressão regular para procurar no e-mail padrão de endereço.
Assim, vemos no primeiro bit olha para qualquer caractere alfanumérico.
Isso é porque os endereços de e-mail, muitas vezes tem que começar com um caractere alfabético.
E então qualquer caractere especial, seguida pelo símbolo @.
E, em seguida, a mesma coisa para o nome de domínio.
E, em seguida, entre 2 e 4 personagens para olhar para o. Com,. Net, e assim por diante.
Então esse é um outro exemplo de expressão regular.
Assim, expressões regulares são protocolos para encontrar padrões em texto.
Eles fazem comparações, seleções, e substituições.
Assim, um terceiro exemplo é encontrar todos os números de telefones que terminam em 54 em um diretório.
Portanto, antes de David rasga o diretório CS50 poderíamos procurar
um padrão onde temos parênteses, em seguida, três números depois acabam parênteses,
Mais 3 números, um traço, dois números e, em seguida, 54.
E isso seria essencialmente como podemos chegar a uma expressão regular para procurar isso.
>> Portanto, há - nós temos feito algumas coisas em CS50 que são um pouco como
expressões regulares, de modo que - por exemplo - no arquivo dictionary.C
para a verificação ortográfica conjunto de problemas que você pode ter usado fscanf
para ler em uma palavra do dicionário.
E você pode ver a 45s percentual está à procura de uma string de 45 caracteres.
Por isso, é um pouco como uma expressão regular rudimentar.
E você pode ter todos os 45 caracteres que cabem a conta lá
e escolher aqueles acima.
E, em seguida, o segundo exemplo no mais recente problema de programação web
definido no código distro para php nós realmente temos uma expressão regular simples.
E este é simplesmente olhando para verificar se a página web que é passado em
corresponde ou de entrar e sair registar. PHP.
E, em seguida, retornar verdadeiro ou falso com base nessa expressão correspondência regular.
>> Então, quando você usar a expressão regular?
Por que você está aqui hoje?
Então você não quer usar a expressão regular, quando há algo que
faz o trabalho para você mesmo mais facilmente.
Então, XML e HTML são realmente muito complicado
escrever expressões regulares para, como veremos daqui a pouco.
Portanto, há analisadores dedicados para essas línguas.
Você também precisa estar bem com o trade offs e precisão com freqüência.
Se você está tentando - por isso vimos uma expressão regular para um endereço de e-mail,
mas disse que queria um endereço de e-mail específico e, gradualmente, o
expressão regular pode tornar-se mais complexa à medida que se tornou mais preciso.
Então, isso seria um trade off.
Você tem que ter certeza de que você está fazendo bem com a expressão regular.
Se você sabe exatamente o que você está procurando, pode fazer mais sentido
para colocar no tempo e escrever um parser mais eficaz.
E, finalmente, há uma questão histórica com a regularidade
de expressões e linguagens.
As expressões regulares são realmente muito mais poderoso do que
expressões regulares por dizer em um sentido formal.
>> Então, eu não quero ir longe demais na teoria formal,
mas a maioria das línguas que código na verdade não são regulares.
E é por isso que as expressões regulares, por vezes, não são considerados todos os que segura.
Então, basicamente, existe uma hierarquia de Chomsky línguas,
e expressões regulares são construídas utilizando-se união, concatenação,
ea operação estrela Kleene que veremos em poucos minutos.
Se você está interessado em teoria, há muitas coisas acontecendo por lá sob o capô.
>> Assim, uma breve história - apenas para o contexto aqui - conjuntos regulares veio
na década de 1950, e depois tivemos editores simples que
incorporou as expressões regulares - apenas procurando por strings.
Grep - que é uma ferramenta de linha de comando - foi um dos primeiros
ferramentas muito populares que incorporou as expressões regulares na década de 1960.
Nos anos 80, Perl foi construído - é uma linguagem de programação que
incorpora expressões regulares muito proeminente.
E então, mais recentemente, tivemos Perl expressões regulares compatíveis
protocolos, basicamente, em outras línguas que usam muito a mesma sintaxe.
Claro que o acontecimento mais importante foi em 2008
onde houve o primeiro Dia Nacional de expressões regulares,
que eu acredito que é 01 de junho, se você quiser comemorar.
>> Mais uma vez, um pouco mais a teoria aqui.
Portanto, há algumas maneiras diferentes de construir expressões regulares.
Uma maneira simples é construir a expressão que você está indo para
executado na seqüência de interpretar - basicamente construir um mini-programa pouco que
vai analisar pedaços de uma corda e ver: "Ah, isso se encaixa a expressão regular ou não?"
E, em seguida, executar isso.
Então se você tem uma pequena expressão regular, este é, provavelmente,
a forma mais eficiente de fazê-lo.
E então se você - outra opção é manter a reconstruir o
expressão que você vá, e que é a possibilidade de simulação.
E essas primeiras tentativas de algoritmos de expressões regulares foram
relativamente simples e relativamente rápido, mas não tem muita flexibilidade.
Então, para fazer ainda algumas das coisas que nós estamos indo olhar
hoje nós tivemos que fazer expressão regular mais complexa
implementações que são potencialmente muito mais lento, de modo que é algo a ter em mente
Há também uma expressão regular de negação variedade ataque
que exploram o potencial para essas implementações mais recentes do
expressões regulares para se tornar muito complexo.
E em grande parte da mesma forma que vimos nos ataques de estouro de buffer,
você tem ataques de que o trabalho por fazer loops recursiva que
superado a capacidade de memória.
E pelo jeito Regexen é um dos plurais oficiais da expressão regular
por analogia com bois na anglo-saxão.
>> Ok, então a biblioteca Python que muitos de vocês aqui em pessoa tem Macs,
assim você pode realmente conseguir isso na sua tela.
As expressões regulares são construídas em Python.
E assim Python é pré-carregado em Macs e também disponível online neste link.
Então, se você está assistindo você pode pausar e certifique-se que você tem Python
como jogamos aqui.
Existe um manual online, então se você apenas digitar Python em seu computador
você vai ver que a versão surge no terminal.
Então, eu forneci um link para o manual para a versão 2 do Python, bem como uma folha de fraude.
Há uma versão 3 do Python, mas o seu Mac não necessariamente
vêm com esse pré-carregado.
Então, não é muito diferente.
Ok, então algumas noções básicas de uso de expressões regulares em Python.
>> Então, aqui eu usei uma expressão muito simples, então eu fiz Python import re
e, em seguida, levou o resultado de re.search.
E a busca leva dois argumentos.
A primeira é a expressão regular, e o segundo é o texto
ou seqüência que você deseja analisar.
E então eu imprimi o result.group.
Então, essas são as duas funções básicas que vamos ver hoje
em aprender sobre expressões regulares.
Então, basta quebrar esta expressão regular aqui
h e, em seguida, \ w e m so \ w apenas aceita qualquer caractere alfabético lá.
Então, aqui estamos à procura de um "h" e, em seguida, um outro caractere alfabético
e, em seguida, m, então aqui que iria coincidir com presunto
em "Abraham Lincoln e sanduíches de presunto."
Este é o resultado do referido grupo.
Outra coisa que podemos fazer é usar nossas cordas antes do texto em Python.
Então eu acho que eu vou ir em frente e puxe que até aqui.
Python import re.
E se eu fosse fazer a mesma coisa - digamos texto é,
"Abraham", vamos fazer zoom in - lá vamos nós.
O texto é: "Abraão come presunto."
Ok, e em seguida, resultado = re.search.
E então nossa expressão pode ser h, e depois vou fazer dot m.
Então dot só leva qualquer caractere que não é uma nova linha, incluindo números,
sinais percentuais, qualquer coisa assim.
E então o texto - crescimento - e, em seguida, result.group--yeah.
Então, isso é apenas a forma de implementar a funcionalidade básica aqui.
Se tivéssemos um anel texto que - esse texto louco - incluído dizer muitas barras invertidas
e cordas dentro e as coisas que poderia parecer seqüências de escape,
então nós provavelmente vai querer usar a entrada de texto simples para se certificar de que é aceito.
E isso só se parece com isso.
Então, se estivéssemos olhando para cada um deles lá, não devemos achar nada.
Mas é assim que você executá-lo, pouco antes da seqüência de
a expressão regular que você colocar a letra r.
>> Ok, então vamos continuar.
Tudo bem - então vamos olhar para um par de padrões repetitivos aqui.
Então, uma coisa que você quer fazer é repetir as coisas
como você está procurando através de texto.
Então, para fazer um seguido por qualquer número de b - você faz ab *.
E depois há uma série de outras regras também.
E você pode olhar todos esses up, vou apenas correr por alguns dos
mais comumente usado queridos.
Assim ab + é seguido por um qualquer N superior a 0 de b.
ab? é seguido por 0 ou 1 de b.
aB N {} é um seguido por N de b e, em seguida assim por diante.
Se você tiver dois números nas chaves que você está especificando um intervalo
que pode ser, possivelmente combinados.
Então, vamos olhar mais para alguns padrões repetitivos em um minuto.
Então, duas coisas para manter em mente quando se utiliza estas ferramentas padrão de harmonização aqui.
Então, dizer que nós queremos olhar para o hm de "Abraham Lincoln faz sanduíches de presunto."
Então eu mudei o nome de Abraham Lincoln a Abraão.
E agora nós estamos procurando o que é retornado por esta função de pesquisa,
e só retorna presunto neste caso.
E ele faz isso porque busca apenas naturalmente leva mais à esquerda fila.
E todas as expressões regulares, a menos que você especifique o contrário vai fazer isso.
Se quiséssemos encontrar tudo o que existe é uma função para isso - encontrar todos.
De modo que só poderia parecer all = re.findall ('h.m', texto)
e, em seguida all.group ().
Todos produz tanto fiambre e presunto, neste caso ambas as cordas em Abraham cada presunto.
Então, isso é uma outra opção.
>> Grande. A outra coisa a ter em mente é que as expressões regulares tirar o maior intuitivamente.
Vejamos este exemplo.
Fizemos isso mais à esquerda pesquisa aqui, e então eu tentei uma pesquisa maior
usando o operador estrela de Kleene.
Assim, para "Abraham Lincoln faz sanduíches de presunto", e eu só tenho de volta
m como resultado.
A razão para esse erro era que eu poderia ter tomado qualquer número de
h é porque eu não especificou nada para ir entre h e m.
O único exemplo que não tinha m - os únicos exemplos lá com m nele
e qualquer número de horas de foram apenas o barbante m.
Então eu tentei de novo, eu disse: "Ok, vamos começar o maior grupo real aqui."
E então eu fiz h. * M, de modo que apenas retorna qualquer número de caracteres entre h e m.
E se você está apenas começando e pensando: "Oh, bem, bem, isso vai
me ham ", ele realmente tem de tudo, desde o h em Abraham Lincoln
todo o caminho até o final de presunto.
É ganancioso, que vê h - tudo isso outro texto - m,
e que é o que leva dentro
Isto é particularmente notório - esta é uma característica que também pode
especificar para não ser ganancioso usando outras funções.
Mas isso é algo que temos que ter em mente especialmente
quando se olha para o texto HTML, que é uma razão que
expressões regulares são difíceis para HTML.
Porque se você tem uma tag HTML aberta e, em seguida, um monte de coisas no meio
e, em seguida, uma outra tag HTML fechada muito mais tarde no programa,
que você acabou de comer um monte de seu código HTML, possivelmente por engano.
>> Tudo bem - personagens tão mais especiais, como muitas outras línguas,
que escapar usando a barra.
Assim, podemos usar o ponto para especificar qualquer caractere, exceto para uma nova linha.
Podemos usar a fuga w para especificar qualquer caractere alfabético.
E por analogia fuga d para qualquer inteiro - personagem numérica.
Podemos especificar - podemos usar colchetes para especificar expressões relacionadas.
Então, isso seria aceitar a, b, ou c.
E também pode especificar ou opções para a ou b.
Por exemplo - se estivéssemos olhando para múltiplas possibilidades
em suportes que podem utilizar o operador ou como em -
então vamos voltar a este exemplo aqui.
E agora vamos ter - vamos voltar a este exemplo aqui, e, em seguida,
levar ae - de modo que este deve retornar - Eu acho que isso ainda é Abraão.
Portanto, este - se fizermos tudo - grande.
Por isso, vamos atualizar o texto aqui.
"Abraham come presunto enquanto sua bainha - enquanto Hemming." Grande.
Todos. Grande. Agora temos presunto, presunto, e bainha.
Enquanto Hemming - enquanto cantarolava para ele - enquanto cantarolava a bainha dele. Grande.
Mesma coisa.
Agora, tudo retorna ainda apenas presunto, presunto, e hem sem pegar no zumbido ou a ele.
Grande - assim que se quiséssemos olhar para qualquer um que - para que pudéssemos também fazer
ele ou - vamos voltar a isso.
Ok - então - tudo bem - em posições que você também pode usar o acento circunflexo ou o cifrão
para especificar que você está procurando algo no início ou no final de uma string.
Ou o início ou o fim de uma palavra.
Essa é uma maneira de usar isso.
>> Ok - então vamos brincar com um bloco um pouco maior de texto.
Vamos dizer que esta linha aqui - esta declaração aqui.
O poder de expressão normal é que eles podem especificar padrões
não apenas fixa caracteres.
Vamos fazer - vamos chamar este bloco.
Então, vamos ler tudo isso dentro
E depois tem a - vamos fazer tudo =, então o que são algumas coisas que poderia procurar aqui rentável?
Poderíamos olhar para o ouvido expressão.
Não é muito interessante. Que tal isso? Vamos ver o que acontece.
Eu dei-lhe um problema.
Assim, uma série de coisas antes de voltar e tudo mais.
De modo que deve devolver tudo desde o início até a totalidade re talvez algumas vezes.
E então aqui nós temos o poder das expressões regulares é que eles
pode especificar padrões não apenas personagens estão aqui.
Assim, todo o caminho até o re final, que começou com a mais esquerda e era ganancioso.
Vamos ver - o que mais poderíamos procurar.
Eu acho que uma coisa se você estivesse interessado em olhar para os pronomes ela e ele,
você pode verificar para s igual a 0 ou 1
ea expressão que ele, e que provavelmente não vai voltar -
oh, eu acho que ele voltou, porque não estamos a olhar para o poder, naquele dia, aqui estão.
Vamos tentar especificando que este tem que vir no início de alguma coisa.
Vamos ver se isso cai.
Assim, podemos fazer gordura, e não nós não temos nada, porque ela e ele
não ocorrem nesta frase.
Grande. Ok - então volta para o gato aqui.
Padrões tão complexos é ferir o cérebro.
Então é por isso que usar expressões regulares para evitar esses problemas.
>> Então, aqui estão alguns outros modos úteis que você pode brincar.
Olhamos para pesquisa de hoje, mas você também pode usar o jogo, split, findall e grupos.
Então, outras coisas legais que você pode fazer com expressões regulares, além de apenas
procurando por padrões está tomando um padrão e mantendo todos os jogos -
suas variáveis ​​- e então usar aqueles em seu código mais tarde.
Isso pode ser bastante útil. Outras coisas podem estar contando.
Assim, podemos contar o número de ocorrências de um padrão de expressão regular,
e é isso que nós podemos usar para grupos.
E outros modos bem também são possíveis.
Então, eu só quero falar um pouco mais sobre outras maneiras que você pode usar expressões regulares.
>> Assim, uma aplicação mais avançada é a correspondência difusa.
Então, se você está procurando um texto para a expressão, Júlio César,
e você quer ver Gaius Julius Caesar ou o nome de Júlio César em outras línguas,
então você pode também querer atribuir algum peso a esses valores.
E se é perto o suficiente - se cruza um determinado limite - então você quer
para ser capaz de aceitar Júlio César.
Portanto, há um par de diferentes implementações para que em algumas outras línguas também.
Aqui estão algumas outras ferramentas, Regex Pal - um aplicativo pequeno e prático on-line para
verificar se suas expressões regulares são compostas corretamente.
Há também ferramentas autônomas que podem ser executados a partir de seu desktop
Pico como Ultra, e, assim como livros de receitas apenas.
Então, se você estiver fazendo um projeto que envolve uma tonelada de expressões regulares
este é provavelmente o lugar para ir fora do âmbito de hoje.
E, em seguida, só para lhe dar uma noção de como é comum
há grep em Unix, Perl tem built-in, e C há PCRE para C.
E então todas essas outras línguas também têm pacotes de expressões regulares
que operam essencialmente com a mesma sintaxe que tem um gosto de hoje.
PHP, Java, Ruby, e assim por diante.
>> Google Code Search é realmente vale a pena mencionar, é um dos
relativamente poucas aplicações lá fora, que permite ao público o acesso
seu banco de dados usando expressões regulares.
Então, se você olhar no Google Code Search, você pode encontrar o código
Se você está procurando um exemplo de como uma função pode ser usada,
você pode usar uma expressão regular para encontrar essa função está sendo usado em todos os tipos de casos diferentes.
Você pode olhar para fwrite, e então você pode olhar para a bandeira de escrever ou ler
se você quiser um exemplo de fwrite sendo usado nesse caso.
Então, a mesma coisa lá, e aqui estão algumas referências.
Este estará disponível on-line, bem como, assim que ir para a frente se
você quer olhar para Python, grep, Perl - você só quer ter alguma inspiração
ou se você quiser olhar mais para a teoria, aqui estão algumas boas salto fora do lugar.
Muito obrigado.
[CS50.TV]