[Powered by Google Translate] [Seminario: Coincidencia de patrones con expresiones regulares] [John Universidad Mussman-Harvard] [Esta es CS50.-CS50.TV] Bien. Bueno, bienvenidos a todos. Esta es CS50 2012. Mi nombre es Juan, y voy a hablar hoy acerca de las expresiones regulares. Las expresiones regulares son principalmente una herramienta, pero también se utiliza a veces en el código de forma activa para que coincida esencialmente patrones y cadenas. Así que aquí está un cómic web de xkcd. En este cómic hay un misterio de asesinato donde el asesino tiene seguido alguien de vacaciones, y los protagonistas tienen que buscar a través de 200 megabytes de mensajes de correo electrónico en busca de una dirección. Y están a punto de darse por vencido cuando alguien que conoce las expresiones regulares - presumiblemente un superhéroe - abalanza sobre él y escribe algo de código y resuelve el misterio de un asesinato. Así que probablemente eso será algo que tendrá la facultad de hacer después de este seminario. Nosotros sólo vamos a proporcionar una breve introducción a la lengua y le dará suficientes recursos para ir tras más recursos por su cuenta. Así expresiones regulares se ven básicamente como esto. Esta es una expresión regular en Ruby. Esto no es muy diferente entre los idiomas. Acabamos de barras para empezar y marcar la expresión regular en Ruby. Y esta es una expresión regular para buscar en el patrón de dirección de correo electrónico. Vemos, pues, en el primer bit busca cualquier carácter alfanumérico. Esto se debe a direcciones de correo electrónico a menudo tienen que comenzar con un carácter alfabético. Y entonces cualquier carácter especial seguido por el símbolo @. Y lo mismo para el nombre de dominio. Y a continuación, entre 2 y 4 caracteres para buscar el. Com,. Red, y así sucesivamente. Así que es otro ejemplo de expresión regular. Así expresiones regulares son protocolos para la búsqueda de patrones en el texto. Lo hacen comparaciones, selecciones y sustituciones. Así que un tercer ejemplo es encontrar todos los números de teléfono que terminan en 54, en un directorio. Así que antes de David rasga el directorio CS50 podríamos buscar un modelo en el que tenemos paréntesis, a continuación, los números 3 y luego terminar paréntesis, 3 números más, un guión, número 2, y luego 54. Y eso sería esencialmente la forma nos encontramos con una expresión regular para buscar eso. Así que hay - que hemos hecho algunas cosas en CS50 que son un poco como expresiones regulares, por lo que - por ejemplo - en el archivo dictionary.C para el hechizo conjunto de problemas de verificación que haya usado fscanf para leer en una palabra del diccionario. Y se puede ver el porcentaje de 45s está en busca de una cadena de 45 caracteres. Así que es algo así como una expresión regular rudimentarios. Y usted puede tener 45 caracteres que se ajustan al proyecto de ley en ese y recoger los de arriba. Y entonces el segundo ejemplo, en el más reciente problema de programación de web establecida en el código distro para php que en realidad tienen una simple expresión regular. Y éste es simplemente tratando de comprobar si la página web que se pasa en coincide con cualquier ingreso o salida del registro. PHP. Y luego regresar verdadero o falso sobre la base de que la coincidencia de expresión regular. Así que cuando usted utiliza la expresión regular? ¿Por qué estás aquí hoy? Así que usted no desea utilizar la expresión regular cuando hay algo que hace el trabajo para usted, incluso con más facilidad. Así XML y HTML son en realidad bastante complicado para escribir expresiones regulares para, como veremos en un rato. Así que hay analizadores específicos para esos idiomas. También es necesario estar de acuerdo con las compensaciones y la exactitud con frecuencia. Si usted está tratando - por lo que hemos visto una expresión regular para una dirección de correo electrónico, pero dijo que quería una dirección de correo específica y poco a poco la expresión regular puede ser más compleja, ya que se hizo más precisa. Así que sería una compensación. Tienes que estar seguro de que usted está haciendo bien con la expresión regular. Si usted sabe exactamente lo que está buscando podría tener más sentido a poner en el tiempo y escribir un parser más eficaz. Y finalmente hay un problema histórico con la regularidad de expresiones y lenguajes. Las expresiones regulares son en realidad mucho más potente que expresiones regulares por decir en un sentido formal. Así que no quiero ir demasiado lejos en la teoría formal, pero la mayoría de lenguajes que código en realidad no son regulares. Y es por eso que a veces las expresiones regulares no se consideran todos los que seguro. Así que, básicamente, hay una jerarquía de Chomsky idiomas, y las expresiones regulares se construyen mediante la unión, concatenación, y la operación de Kleene estrellas que veremos en unos minutos. Si usted está interesado en la teoría de que hay mucho que hacer allí bajo el capó. Así que un poco de historia - sólo para el contexto aquí - conjuntos regulares subieron en la década de 1950, y luego tuvimos editores simples que incorporado expresiones regulares - sólo la búsqueda de cadenas. Grep - que es una herramienta de línea de comandos - fue uno de los primeros herramientas muy populares que incorporan expresiones regulares en los años 1960. En los años 80, Perl fue construido - es un lenguaje de programación que incorpora expresiones regulares muy prominente. Y luego, más recientemente, hemos tenido Perl expresiones regulares compatibles protocolos básicamente en otros idiomas que utilizan gran parte de la misma sintaxis. Por supuesto, el evento más importante fue en 2008 donde tuvo lugar el primer Día Nacional de las expresiones regulares, que creo que es el 1 de junio, si usted quiere celebrar eso. Una vez más, sólo un poco más de teoría aquí. Así que hay un par de maneras diferentes de construir expresiones regulares. Una forma sencilla es la construcción de la expresión que se va a ejecutarse en la cadena de interpretar - básicamente construir un mini-programa pequeño que analizará las piezas de una cadena y ver, "Oh, es compatible con la expresión regular o no?" Y luego ejecutar ese. Así que si usted tiene una pequeña expresión regular, esto es, probablemente, la manera más eficiente de hacerlo. Y luego si - otra opción es mantener la reconstrucción de la expresión a medida que avanza, y que es la posibilidad Simulación. Y estos primeros intentos de algoritmos de expresiones regulares se relativamente simple y relativamente rápido, pero no tienen mucha flexibilidad. Así que para hacer aún algunas de las cosas que vamos a ver hoy hemos tenido que hacer expresión regular más compleja implementaciones que son potencialmente mucho más lenta, de modo que es algo a tener en cuenta También hay una expresión regular de la negación de la variedad ataque que explotar el potencial de estas nuevas implementaciones de expresiones regulares para llegar a ser muy compleja. Y en el mismo sentido que hemos visto en los ataques de desbordamiento de búfer, usted tiene ataques de ese trabajo por hacer bucles recursivos que desbordamiento de la capacidad de la memoria. Y, por cierto Regexen es uno de los plurales oficiales de expresión regular por analogía a los bueyes en el mundo anglosajón. Bien, entonces la biblioteca Python que muchos de ustedes aquí en persona tienen Macs, por lo que en realidad se puede sacar esto en la pantalla. Las expresiones regulares se construyen en Python. Y así Python está preinstalado en ordenadores Mac y también disponible en línea en este enlace. Así que si usted está viendo puede hacer una pausa y asegúrese de que tiene Python como jugamos aquí. Hay un manual en línea, así que si usted acaba de escribir Python en el ordenador verá que la versión aparece en el terminal. Así que he proporcionado un enlace al manual para la versión 2 de Python, así como una hoja de trucos. Hay una versión de Python 3, pero el Mac no necesariamente venido con ese precargado. Así que no es terriblemente diferente. Bueno, por lo que algunos aspectos básicos del uso de expresiones regulares en Python. Así que aquí he usado una expresión muy simple, así que lo hice Python import re y luego tomó el resultado de re.search. Y la búsqueda tiene 2 argumentos. La primera es la expresión regular, y el segundo es el texto o una cadena que quiere analizar. Y luego imprimí la result.group. Así que estas son las 2 funciones básicas que vamos a ver hoy en día en aprender acerca de las expresiones regulares. Así que romper con esta expresión regular aquí h y \ w y m so \ w sólo acepta cualquier carácter alfabético en allí. Así que aquí estamos buscando una "h" y luego otro carácter alfabético y luego m, por lo que aquí se correspondería con jamón en "Abraham Lincoln y jamón sándwiches". Este es el resultado de ese grupo. Otra cosa que podemos hacer es utilizar nuestras cuerdas antes del texto en Python. Así que supongo que voy a seguir adelante y lograr eso aquí. Python import re. Y si tuviera que hacer la misma cosa - digamos texto es, "Abraham," vamos a hacer un zoom in - Eso es. El texto es, "Abraham se come jamón." Bueno, y luego dar = re.search. Y entonces nuestra expresión puede ser h, y luego haré dot m. Así punto sólo se necesita cualquier carácter que no es una nueva línea con datos cuantificados, signos de porcentaje, nada de eso. Y luego el texto - auge - y luego result.group--sí. Así que eso es sólo la forma de aplicar la funcionalidad básica aquí. Si tuviéramos un anillo de texto que - ese texto loco - incluida decir un montón de barras invertidas y las cuerdas dentro y cosas que pueden parecerse a las secuencias de escape, entonces es probable que desee utilizar la entrada de texto sin formato para asegurarse de que sea aceptada. Y eso sólo se parece a eso. Así que si lo que estábamos buscando cada uno de ellos hay no hay que buscar nada. Pero eso es lo que le implementarlo; justo antes de la cadena de la expresión regular que puso la letra r. Está bien, así que vamos a seguir adelante. Muy bien - así que vamos a ver un par de patrones repetitivos aquí. Así que una cosa que quiero hacer es repetir las cosas como usted está buscando a través del texto. Así que hacer un seguido de cualquier número de b - hacer ab *. Y luego hay una serie de otras normas también. Y se puede ver todo esto, pues yo voy a correr a través de algunos de los más comúnmente usadas. Así ab + es seguido por cualquier N mayor que 0 de b. ab? es un seguido de 0 o 1 de b. ab {N} es seguido por N, b, y así sucesivamente. Si usted tiene 2 números de las llaves está especificando un rango que puede ser posiblemente emparejados. Así que vamos a ver más en un par de patrones repetitivos en un minuto. Así que 2 cosas a tener en cuenta al utilizar estas herramientas de comparación de patrones aquí. Así que decimos que queremos mirar el hm de "Abraham Lincoln hace bocadillos de jamón." Así que cambié el nombre de Abraham Lincoln de Abraham. Y ahora que estamos buscando lo que es devuelto por esta función de búsqueda, y sólo regresa el jamón en este caso. Y lo hace porque busca sólo toma naturalmente la izquierda más cola. Y todas las expresiones regulares a menos que se especifique lo contrario lo harán. Si quisiéramos encontrar todo lo que hay es una función para que - encontrar de todo. Así que podría acaba de ver como todo = re.findall ('h.m', texto) y luego all.group (). Todos produce tanto jamón y jamón, en este caso tanto de las cadenas de Abraham cada jamón. Así que esa es otra opción. Grande. La otra cosa a tener en cuenta es que las expresiones regulares se llevan la mayor intuitiva. Veamos este ejemplo. Lo hicimos más a la izquierda de búsqueda aquí, y luego intentó una búsqueda más grande utilizando el operador estrella de Kleene. Así que para "Abraham Lincoln hace sándwiches de jamón", y sólo regresó m como resultado. La razón de este error es que yo podría haber tenido cualquier número de h es porque no se especifica nada para ir entre h y m. El único ejemplo que no tenía m - los únicos ejemplos allí con m en el mismo y cualquier número de h de fuera sólo la cadena m. Luego intenté de nuevo, yo dije: "Bueno, vamos a obtener el mayor grupo real aquí." Y entonces hice h. * M, de modo que sólo devuelve cualquier número de caracteres entre h y m. Y si usted está recién empezando y pensando, "Oh, está bien, bueno esto se me consiga el jamón ", que realmente tiene de todo, desde la hora en Abraham Lincoln todo el camino hasta el extremo de jamón. Es codicioso, sino que ve h - todo esto otro texto - m, y eso es lo que se in Esto es particularmente notorio - esta es una característica que también puede especificar para no ser avaro con otras funciones. Pero esto es algo que tenemos que tener en cuenta especialmente cuando se mira en texto HTML, que es una de las razones que expresiones regulares son difíciles de HTML. Porque si usted tiene una etiqueta abierta HTML y luego un montón de cosas en el medio y luego otro HTML tag cerrado mucho más tarde en el programa, usted acaba de comer una gran cantidad de su código HTML, posiblemente por error. Muy bien - lo más caracteres especiales, como muchos otros idiomas, escapamos con la barra. Así que podemos usar el punto para especificar cualquier carácter excepto una línea nueva. Podemos utilizar la escalera de w para especificar cualquier carácter alfabético. Y por analogía escapar d para cualquier entero - carácter numérico. Podemos especificar - podemos usar paréntesis para especificar expresiones relacionadas. Así que esto sería aceptar a, b, o c. Y también podemos especificar o opciones para a o b. Por ejemplo - si estábamos buscando para múltiples posibilidades entre paréntesis podríamos utilizar el operador o, como en - así que vamos a volver a este ejemplo. Y ahora vamos a tomar - volvamos a este ejemplo aquí y, a continuación, tomar ae - por lo que este debe devolver - Supongo que esto es todavía Abraham. Así que esto - si hacemos todo - muy bien. Así que vamos a actualizar el texto aquí. "Abraham come jamón mientras el dobladillo - mientras dobladillo." Grande. Todos. Grande. Ahora tenemos el jamón, el jamón y el dobladillo. Mientras dobladillo - mientras tarareaba a él - mientras tarareaba le dobladillo. Grande. Es lo mismo. Ahora todo vuelve aún sólo jamón, jamón, y en el bajo sin necesidad de levantar el zumbido o el de él. Great - ¿y qué si nos queríamos ver, o bien que - por lo que también podríamos hacer él o - vamos a volver a eso. Okay - así - de acuerdo - en puestos también puede utilizar el cursor o el signo de dólar para especificar que usted está buscando algo en el comienzo o el final de una cadena. O el comienzo o el final de una palabra. Esa es una manera de usarla. Bien - así que vamos a jugar con un bloque de un poco más grande de texto. Digamos esta fila aquí - esta declaración aquí. El poder de la expresión regular es que se pueden especificar patrones no sólo fijado caracteres. Hagamos - llamémoslo este bloque. A continuación, vamos a leer todo eso pulg Y entonces a - hagamos todo =, así que ¿cuáles son algunas cosas que podríamos buscar aquí rentable? Podríamos buscar la oreja expresión. No es muy interesante. ¿Qué te parece? Ya veremos lo que pasa. Le di un problema. Por lo que cualquier número de cosas antes de volver y todo. Así que debe devolver todo desde el principio hasta los re quizás un par de veces. Y aquí tenemos el poder de las expresiones regulares es que ellos Puede especificar los patrones no sólo personajes aquí son. Así que todo el camino hasta la re final, que comenzó con la más a la izquierda y era codicioso. Veamos - ¿qué más se puede buscar. Supongo que una cosa si estaban interesados ​​en la búsqueda de los pronombres ella y él, se puede comprobar por s es igual a 0 ó 1 y la expresión que él, y que no es, probablemente, va a regresar - oh, supongo que regresó, porque no estamos ante el poder, ese día, aquí estamos. Vamos a tratar de precisar que esto tiene que venir en el comienzo de algo. Vamos a ver si eso cae. Así que podemos hacer de grasa, y hay que no hacer nada, porque ella y él no se producen en esta frase. Grande. Bien - así que volvimos a el gato aquí. Patrones tan complejo está dañando el cerebro. Así que es por eso que utilizamos expresiones regulares para evitar estos problemas. Así que aquí están algunos otros medios útiles que puedes jugar. Nos fijamos en búsqueda de hoy, pero también se puede utilizar partido, partido, findall y grupos. Así otras cosas interesantes que puedes hacer con las expresiones regulares, además de sólo en busca de patrones está tomando un patrón y la celebración de todos los partidos - sus variables - y luego con los de su código más adelante. Eso puede ser muy útil. Otras cosas que pueden estar contando. Así que podemos contar el número de instancias de un patrón de expresión regular, y eso es lo que podemos utilizar grupos para. Y otros modos, así también son posibles. Así que sólo quiero hablar un poco más acerca de otras maneras de utilizar expresiones regulares. Así que una aplicación más avanzada está en coincidencia aproximada. Así que si estás buscando un texto para la expresión, Julio César, y ves bien Cayo Julio César, o el nombre de Julio César en otros idiomas, entonces es posible que también desee asignar cierto peso a esos valores. Y si es lo suficientemente cerca - si se cruza un umbral determinado - entonces usted quiere para ser capaz de aceptar Julio César. Así que hay un par de diferentes implementaciones para que en algunos otros idiomas. Aquí están algunas otras herramientas, Regex Pal - una pequeña aplicación práctica en línea para comprobar si sus expresiones regulares se componen correctamente. También existen herramientas independientes que se pueden ejecutar desde el escritorio como Pico Ultra, y así como libros de cocina solo. Así que si usted está haciendo un proyecto que implica un montón de expresiones regulares este es probablemente el lugar para ir fuera del alcance de hoy. Y a continuación, sólo para darle un sentido de lo común que es hay grep en Unix, Perl tiene incorporado, y C no PCRE para C. Y luego todos los otros idiomas también tienen paquetes de expresiones regulares que operan esencialmente con la misma sintaxis que tenemos el gusto de hoy. PHP, Java, Ruby, etc. Google Code Search es en realidad vale la pena mencionar, es uno de los relativamente pocas aplicaciones por ahí que permite al público tener acceso a su base de datos usando expresiones regulares. Así que si usted busca en Google Code Search se puede encontrar el código si usted está buscando un ejemplo de cómo se puede usar una función, se puede utilizar una expresión regular para encontrar que la función que se utiliza en todo tipo de casos diferentes. Se podría buscar fwrite, y entonces se podría buscar la bandera de escritura o lectura si quieres un ejemplo de fwrite se utiliza en este caso. Así que lo mismo allí, y aquí están algunas referencias. Este estará disponible en línea, así que ir hacia adelante si que desea buscar en Python, grep, Perl - lo que desea es obtener algo de inspiración o si desea buscar más en la teoría aquí es un buen salto de lugares. Muchas gracias. [CS50.TV]