[Powered by Google Translate] [Seminario: Correspondencia de patrón con expresións regulares] [John Mussman-Harvard University] [É dicir CS50.-CS50.TV] Okay. Benvidos todos. É dicir CS50 2012. O meu nome é Xoán, e vou falar hoxe sobre expresións regulares. As expresións regulares é esencialmente unha ferramenta, pero tamén por veces utilizado en código activamente para corresponden esencialmente patróns e cadeas. Entón aquí está un cómic web de xkcd. Neste cómic hai un misterio de asasinato onde o asasino ten seguido alguén en vacacións, e os protagonistas teñen que buscar a través de 200 megabytes de correos electrónicos na procura dun enderezo. E eles están a piques de desistir cando alguén que coñece expresións regulares - presuntamente un superheroe - descende rapidamente e escribe un código e resolve o misterio do asasinato. Así, presuntamente, que será algo que estará habilitado a facer tras este seminario. Nós só estamos indo a ofrecer unha introdución concisa á linguaxe e darlle o suficiente recursos para ir atrás de máis recursos no seu propio país. Así, expresións regulares ollar basicamente así. Esta é unha expresión regular en Ruby. Non é moi diferente entre as linguas. Temos só en barras para comezar e marcar a expresión regular en Ruby. E esta é unha expresión regular para buscar no correo electrónico estándar de enderezo. Así, podemos ver o primeiro bit mira para calquera carácter alfanumérico. Isto é porque os enderezos de correo-e, moitas veces ten que comezar cun carácter alfabético. E entón calquera carácter especial, seguida polo símbolo @. E, a continuación, o mesmo para o nome de dominio. E, a continuación, entre 2 e 4 personaxes para ollar a. Co,. Net, e así por diante. Entón ese é outro exemplo de expresión regular. Así, expresións regulares son protocolos para atopar patróns en texto. Eles fan comparacións, seleccións, e substitucións. Así, un terceiro exemplo é atopar todos os números de teléfonos que terminan en 54 nun directorio. Polo tanto, antes de David resga o directorio CS50 poderiamos buscar un patrón onde temos parénteses, a continuación, tres números despois acaban parénteses, Máis 3 números, un guión, dous números e, a continuación, 54. E iso sería esencialmente como podemos chegar a unha expresión regular para buscar iso. Polo tanto, hai - nós fixemos algunhas cousas en CS50 que son un pouco como expresións regulares, de xeito que - por exemplo - o ficheiro dictionary.C para a comprobación ortográfica conxunto de problemas que pode ter usado fscanf para ler nunha palabra do dicionario. E podes ver a 45s porcentaxe está buscando unha cadea de 45 caracteres. Por iso, é un pouco como unha expresión regular rudimentar. E pode ter todos os 45 caracteres que caben a conta alí e seleccionar aqueles enriba. E, a continuación, o segundo exemplo no último problema de programación web definido no código distro para php nós realmente temos unha expresión regular simple. E este é simplemente ollando para comprobar que a páxina web que está pasado en corresponde ou de entrar e saír rexistrar. PHP. E, a continuación, regresar verdadeiro ou falso con base nesa expresión correspondencia regular. Entón, cando usa a expresión regular? Por que está aquí hoxe? Así que non quere usar a expresión regular, cando hai algo que fai o traballo para ti mesmo con máis facilidade. Entón, XML e HTML son realmente moi complicado escribir expresións regulares para, como veremos de aquí a pouco. Polo tanto, hai análise dedicados a esas linguas. Tamén cómpre estar ben co comercio offs e precisión a miúdo. Se estás - polo que puidemos ver unha expresión regular para un enderezo de correo electrónico, pero dixo que quería un enderezo de correo-e específico e, gradualmente, o expresión regular pode chegar a ser máis complexa á medida que se fixo máis preciso. Entón, iso sería un trade off. Ten que estar seguro de que está facendo ben coa expresión regular. Se sabe exactamente o que está a buscar, pode facer máis sentido para poñer no tempo e escribir un parser máis eficaz. E, finalmente, hai unha cuestión histórica coa regularidade de expresións e linguaxes. As expresións regulares son realmente moito máis poderoso do que expresións regulares por dicir nun sentido formal. Entón, eu non quero ir lonxe de máis na teoría formal, pero a maioría das linguas que o código en realidade non son regulares. E é por iso que as expresións regulares, por veces, non son considerados todo que suxeita. Entón, basicamente, existe unha xerarquía de Chomsky linguas, e expresións regulares son construídas utilizando-se unión, concatenação, ea operación estrela Kleene que veremos en poucos minutos. Se estás interesado en teoría, hai moitas cousas a suceder por alí baixo o capó. Así, unha breve historia - só para o contexto aquí - conxuntos regulares veu na década de 1950, e despois tivemos editores simples que incorporou as expresións regulares - só buscando por cadeas. Grep - que é unha ferramenta de liña de comandos - foi un dos primeiros ferramentas moi populares que incorporou as expresións regulares na década de 1960. Nos anos 80, Perl foi construído - é unha linguaxe de programación que incorpora expresións regulares moi destacado. E entón, máis recentemente, tivemos Perl expresións regulares compatible protocolos basicamente noutras linguas que usan moito a mesma sintaxe. Claro que o acontecemento máis importante foi en 2008 onde houbo o primeiro Día Nacional de expresións regulares, que eu creo que é 01 de xuño, se quere conmemorar. Unha vez máis, un pouco máis a teoría aquí. Polo tanto, hai algunhas formas diferentes de construír expresións regulares. Un xeito sinxelo é construír a expresión que está indo a executado na secuencia de interpretar - basicamente construír un mini-programa pouco que vai analizar anacos dunha corda para ver: "Ah, iso encaixa a expresión regular ou non?" E, a continuación, realizar iso. Entón se ten unha pequena expresión regular, este é, probablemente, a forma máis eficiente de facelo. E entón se - outra opción é manter a reconstruír o expresión que vaia, e que é a posibilidade de simulación. E esas primeiras tentativas de algoritmos de expresións regulares foron relativamente sinxela e relativamente rápido, pero non ten moita flexibilidade. Entón, para facer aínda algunhas das cousas que nós estamos indo ollar hoxe tivemos que facer expresión regular máis complexa implementacións que son potencialmente moito máis lento, de xeito que é algo a ter en conta Hai tamén unha expresión regular de denegación variedade ataque que explotan o potencial para estas implementacións máis recentes do expresións regulares para facer moi complexo. E en gran parte do mesmo xeito que vimos nos ataques de estourido de buffer, ten ataques de que o traballo por facer loops recursiva que superou a capacidade de memoria. E ao parecer Regexen é un dos plurales oficiais da expresión regular por analoxía con bois en anglosaxón. Ok, entón a biblioteca Python que moitos de vostedes aquí en persoa ten Macs, así realmente pode conseguir isto na súa pantalla. As expresións regulares son construídas en Python. E así Python é pre-cargado en Macs e tamén dispoñible en liña nesta ligazón. Entón, se está a asistir pode deter e asegúrese de que ten Python como xogamos aquí. Existe un manual en liña, entón se só escribir Python no seu computador vai ver que a versión xorde no terminal. Entón, eu forneci unha ligazón ao manual para a versión 2 do Python, así como unha folla de fraude. Hai unha versión 3 do Python, mais o seu Mac non necesariamente veñen con este precargado. Entón, non é moi diferente. Ok, entón algunhas nocións básicas de uso de expresións regulares en Python. Entón, aquí eu usei unha expresión moi sinxelo, entón eu fixen Python import re e, a continuación, levou o resultado re.search. E a procura leva dous argumentos. O primeiro é a expresión regular, e que o segundo é o texto ou secuencia que quere analizar. E entón eu imprimir o result.group. Entón, estas son as dúas funcións básicas que imos ver hoxe en aprender sobre expresións regulares. Entón, só tes que romper esta expresión regular aquí h e logo, \ w e m so \ w só acepta calquera carácter alfabético alí. Entón, aquí estamos buscando un "h" e logo, outro carácter alfabético e logo, m, entón aquí que ía coincidir con xamón en "Abraham Lincoln e bocadillos de xamón." Este é o resultado do dito grupo. Outra cousa que podemos facer é usar as nosas cordas antes do texto en Python. Entón eu creo que eu vou ir adiante e puxe que ata aquí. Python import re. E se eu fose facer o mesmo - digamos texto, "Abraham", imos facer zoom in - alí imos nós. O texto é: "Abraham come xamón." Vale, e logo resultado = re.search. E entón a nosa expresión pode ser h, e despois vou facer dot m. Entón dot só leva calquera carácter que non é unha nova liña, incluíndo números, sinais porcentuais, algo así. E entón o texto - crecemento - e logo, result.group--yeah. Entón, iso é só a forma de aplicar a funcionalidade básica aquí. Se tivésemos un anel texto - este texto tolo - incluído dicir moitas barras invertidas e cordas dentro e as cousas que podería parecer secuencias de escape, entón probablemente vai querer utilizar a entrada de texto simple para asegurarse de que é aceptado. E iso só se parece con isto. Entón, se estivésemos mirando para cada un deles alí, non hai que pensar nada. Pero é así que executalo, pouco antes da secuencia de a expresión regular que poñer a letra r. Ok, entón imos seguir. Todo ben - entón imos ollar para un par de patróns repetitivos aquí. Entón, unha cousa que quere facer é repetir as cousas como está a buscar a través de texto. Entón, para facer un seguido por calquera número de b - fai ab *. E despois hai unha serie de outras regras tamén. E pode mirar todos eses up, vou só correr por algúns dos máis comumente usado queridos. Así ab + é seguido por un calquera n superior a 0 de b. ab? é seguido por 0 ou 1 de b. AB n {} é un seguido de N de b e logo así por diante. Se ten dous números nas claves que está especificando un intervalo que se pode, posiblemente combinados. Entón, imos ollar máis para algúns patróns repetitivos nun minuto. Así, dúas cousas para manter presente cando se utiliza estas ferramentas estándar de harmonización aquí. Entón, dicir que queremos mirar o hm de "Abraham Lincoln fai bocadillos de xamón." Entón eu mudei o nome de Abraham Lincoln a Abraham. E agora estamos a buscar o que é de retorno por esta función de investigación, e só volve xamón neste caso. E el fai iso por que busca só naturalmente leva máis á esquerda cola. E todas as expresións regulares, a non ser que especifique o contrario vai facer. Se quixésemos atopar todo o que existe é unha función para iso - atopar todos. De xeito que só podería parecer all = re.findall ('h.m', texto) e logo all.group (). Todos produce tanto fiambre e xamón, neste caso as dúas cordas en Abraham cada xamón. Entón, iso é outra opción. Grande. A outra cousa a ter presente é que as expresións regulares sacar o maior intuitivamente. Vexamos este exemplo. Fixemos iso máis á esquerda procura aquí, e entón eu tente unha procura máis usar o operador estrela de Kleene. Así, a "Abraham Lincoln fai bocadillos de xamón", e eu só teño de volta m como resultado. A razón para este erro foi que eu podería tomar calquera número de h é porque eu non especificou nada para ir entre h e m. O único exemplo que non m - os únicos exemplos alí con m nel e calquera número de horas de foron só o Barbante m. Entón eu tente de novo, eu dixen: "Ok, imos comezar o maior grupo real aquí." E entón eu fixen h. * M, de xeito que só retorna calquera número de carácteres entre h e m. E se está só comezando e pensar: "Oh, ben, ben, iso vai me han ", realmente ten de todo, dende o h en Abraham Lincoln todo o camiño ata o final de xamón. É ganancioso, que ve h - todo isto outro texto - m, e que é o que leva dentro Isto é particularmente notorio - esta é unha característica que tamén pode especificar para non ser ganancioso usar outras funcións. Pero iso é algo que temos que ter presente sobre todo cando se mira para o texto HTML, que é unha razón que expresións regulares son difíciles para HTML. Porque se ten unha etiqueta HTML aberta e, a continuación, unha morea de cousas no medio e logo, outra etiqueta HTML pechada moito máis tarde no programa, que acaba de comer unha morea de seu código HTML, posiblemente por erro. Todo ben - personaxes tan máis especiais, como moitas outras linguas, que escapar a través da barra. Así, podemos empregar o punto para especificar calquera carácter, excepto para unha nova liña. Podemos usar a fuga w para especificar calquera carácter alfabético. E por analoxía fuga d para calquera enteiro - personaxe numérica. Podemos especificar - podemos usar corchetes para indicar expresións relacionadas. Entón, iso sería aceptar a, b, c. E tamén pode especificar ou opcións para a ou b. Por exemplo - se estivésemos mirando múltiples posibilidades en soportes que poden utilizar o operador ou como en - entón imos volver a este exemplo aquí. E agora imos ter - imos volver a este exemplo aquí, e, a continuación, levar AE - de xeito que este debe devolver - Eu creo que iso aínda é Abraham. Polo tanto, este - se facemos todo - gran. Por iso, imos actualizar o texto aquí. "Abraham come xamón mentres a súa vaíña - mentres Hemming." Grande. Todo. Grande. Agora temos xamón, xamón, e vaíña. Mentres Hemming - mentres cantarolava para el - mentres cantarolava a vaíña del. Grande. Mesmo. Agora, todo volve aínda só xamón, xamón, e hem sen incorporarse o zumbido ou a el. Gran - así que se quixésemos ollar para calquera que - para que pudéssemos tamén facer el ou - imos volver a iso. Ok - entón - todo ben - en posicións que tamén pode utilizar o acento circunflexo ou o cifrão para indicar que quere máis que no inicio ou ao final dunha cadea. Ou o inicio ou o final dunha palabra. Esta é unha forma de usar iso. Ok - entón imos xogar con un bloque un pouco máis grande de texto. Digamos que esta liña aquí - esta declaración aquí. O poder de expresión normal é que poden especificar patróns non só fixa caracteres. Imos facer - imos chamar este bloque. Entón, imos ler todo iso dentro E despois ten a - imos facer todo =, entón o que son algunhas cousas que podería buscar aquí rendible? Poderiamos mirar para o oído expresión. Non é moi interesante. Que tal isto? Veremos que pasa. Eu dei-lle un problema. Así, unha serie de cousas antes de volver e todo máis. De xeito que debe devolver todo desde o principio ata a totalidade re quizais algunhas veces. E entón aquí temos o poder das expresións regulares é que pode especificar patróns non só personaxes están aquí. Así, todo o camiño ata o re final, que comezou coa máis esquerda e era ganancioso. A ver - o que máis poderiamos buscar. Eu creo que unha cousa se está interesado en ollar os pronomes ela e el, pode comprobar para s igual a 0 ou 1 ea expresión que el, e que probablemente non vai volver - Oh, eu creo que volveu, porque non estamos a mirar para o poder, aquel día, aquí están. Imos tentar especificando que este ten que vir a comezos de algo. A ver se isto cae. Así, podemos facer graxa, e non nós non temos nada, porque ela e el non ocorren nesta frase. Grande. Ok - entón ao seu gato aquí. Patróns tan complexos e ferir o cerebro. Entón é por iso que usar expresións regulares para evitar estes problemas. Entón, aquí están algúns outros modos útiles que pode xogar. Miramos para investigación de hoxe, pero tamén pode usar o xogo, split, findall e grupos. Entón, outras cousas legais que podes facer con expresións regulares, ademais de só buscar patróns está tomando un patrón e mantendo todos os xogos - súas variables - e entón usar aqueles no seu código máis tarde. Isto pode ser moi útil. Outras cousas poden estar contando. Así, podemos contar o número de ocorrencias dun patrón de expresión regular, e é o que podemos utilizar para grupos. E outros modos ben tamén son posibles. Entón, eu só quero falar un pouco máis sobre outras formas que pode usar expresións regulares. Así, unha aplicación máis avanzada é a correspondencia difusa. Entón, se está a buscar un texto para a expresión, Xulio César, e quere ver Gaius Julius Caesar ou nome de Xulio César noutras linguas, entón podes querer asignar un peso a eses valores. E se é preto o suficiente - se cruza un determinado límite - entón quere para poder aceptar Xulio César. Polo tanto, hai un par de diferentes implementacións para que nalgunhas outras linguas tamén. Aquí están algunhas outras ferramentas, expresión regular Pal - unha aplicación pequeno e práctico en liña para comprobar se as súas expresións regulares son compostas correctamente. Hai tamén ferramentas autónomas que poden ser executados a partir do seu escritorio Pico como Ultra, e, así como libros de ingresos só. Entón, se está facendo un proxecto que implica unha tonelada de expresións regulares este é probablemente o lugar para ir fóra do ámbito de hoxe. E, a continuación, só para lle dar unha idea de como é común hai grep en Unix, Perl ten built-in, e C hai PCRE para C. E entón todas esas outras linguas tamén teñen paquetes de expresións regulares que operan esencialmente coa mesma sintaxe que ten un gusto de hoxe. PHP, Java, Ruby, e así por diante. Google Code Search é realmente paga a pena mencionar, é un dos relativamente poucas aplicacións aí fóra, que permite ao público o acceso súa base de datos usando expresións regulares. Entón, se ollar en Google Code Search, pode atopar o código Se está a buscar un exemplo de como unha función pode ser usada, pode usar unha expresión regular para atopar esta función está a ser usado en todo tipo de casos diferentes. Podes ollar para fwrite, e entón podes ollar para a bandeira de escribir ou ler se quere un exemplo de fwrite ser usado nese caso. Entón, o mesmo alí, e aquí están algunhas referencias. Este estará dispoñible en liña, así como, así que ir á fronte se quere ollar para Python, grep, Perl - só quere ter algunha inspiración ou se quere ollar máis para a teoría, aquí están algunhas boas salto fóra do lugar. Moitas grazas. [CS50.TV]