{"id":123248,"date":"2022-03-24T15:40:59","date_gmt":"2022-03-24T15:40:59","guid":{"rendered":"https:\/\/blog.finxter.com\/?p=260565"},"modified":"2022-03-24T15:40:59","modified_gmt":"2022-03-24T15:40:59","slug":"python-regex-como-contar-el-numero-de-coincidencias","status":"publish","type":"post","link":"https:\/\/sickgaming.net\/blog\/2022\/03\/24\/python-regex-como-contar-el-numero-de-coincidencias\/","title":{"rendered":"Python Regex \u2013 \u00bfC\u00f3mo contar el n\u00famero de coincidencias?"},"content":{"rendered":"<p class=\"has-global-color-8-background-color has-background\">Para contar un patr\u00f3n de expresi\u00f3n regular varias veces en una cadena dada, usa el m\u00e9todo <code>len(re.findall(pattern, string))<\/code> que devuelve el n\u00famero de subcadenas coincidentes o <code>len([*re.finditer(pattern, text)])<\/code> que desempaqueta todas las subcadenas coincidentes en una lista y tambi\u00e9n devuelve la longitud de la misma.<\/p>\n<p><em>Hace unas horas, escrib\u00ed una <\/em><a href=\"https:\/\/blog.finxter.com\/python-regex\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>expresi\u00f3n regular en Python<\/em><\/a><em> que coincid\u00eda no una sino varias veces en el texto y me pregunt\u00e9: <\/em><strong><em>\u00bfc\u00f3mo contar el n\u00famero de coincidencias?<\/em><\/strong><\/p>\n<p>Considera el ejemplo m\u00ednimo en el que buscas un n\u00famero arbitrario de caracteres de palabras <code>'[a-z]+'<\/code> en una frase dada <code>'python is the best programming language in the world'<\/code>.<\/p>\n<p>Puedes ver mi v\u00eddeo explicativo a medida que lees el tutorial:<\/p>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Python Regex \u2013 \u00bfC\u00f3mo contar el n\u00famero de coincidencias?\" width=\"780\" height=\"439\" src=\"https:\/\/www.youtube.com\/embed\/N3MqijszEvI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n<\/div>\n<\/figure>\n<p><strong>Art\u00edculo relacionado:<\/strong> <a href=\"https:\/\/blog.finxter.com\/python-regex\/\" target=\"_blank\" rel=\"noreferrer noopener\">Superpoderes Regex de Python &#8211; La gu\u00eda definitiva<\/a><\/p>\n<p>Los ingenieros de Google, Facebook y Amazon son aut\u00e9nticos maestros de expresiones regulares. Si quieres convertirte en uno tambi\u00e9n, echa un vistazo a nuestro nuevo libro: <a href=\"https:\/\/amzn.to\/2Bcw5kK\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>La forma m\u00e1s inteligente de aprender Python Regex<\/strong><\/a> <em>(Amazon Kindle\/Print, se abre en una nueva pesta\u00f1a)<\/em>.<\/p>\n<p>\u00bfCu\u00e1ntas coincidencias hay en la cadena? Para contar el n\u00famero de coincidencias, puede usar varios m\u00e9todos:<\/p>\n<h2>M\u00e9todo 1: Python re.findall()<\/h2>\n<p>Usa el <a href=\"https:\/\/blog.finxter.com\/python-re-findall\/\" target=\"_blank\" rel=\"noreferrer noopener\">m\u00e9todo <code>re.findall(pattern, string)<\/code><\/a> que devuelve una lista de subcadenas coincidentes. Luego cuenta la longitud de la <a href=\"https:\/\/blog.finxter.com\/python-lists\/\" target=\"_blank\" rel=\"noreferrer noopener\">lista<\/a> devuelta. Aqu\u00ed hay un ejemplo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">>>> import re\n>>> pattern = '[a-z]+'\n>>> text = 'python is the best programming language in the world'\n>>> len(re.findall(pattern, text))\n9<\/pre>\n<p>\u00bfPor qu\u00e9 es 9 el resultado? Debido a que hay nueve subcadenas coincidentes en la lista devuelta por el m\u00e9todo <code>re.findall()<\/code>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">>>> re.findall(pattern, text)\n['python', 'is', 'the', 'best', 'programming', 'language', 'in', 'the', 'world']<\/pre>\n<p>Este m\u00e9todo funciona muy bien si no hay coincidencias solapadas.<\/p>\n<p><strong><em>\u00bfQuieres dominar el superpoder regex?<\/em><\/strong> Echa un vistazo a mi nuevo libro <a href=\"https:\/\/blog.finxter.com\/ebook-the-smartest-way-to-learn-python-regex\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong><em>La forma m\u00e1s inteligente de aprender expresiones regulares en Python<\/em><\/strong><\/a> con el innovador enfoque de 3 pasos para el aprendizaje activo: (1) estudia un cap\u00edtulo de libro, (2) resuelve un rompecabezas de c\u00f3digo y (3) mira un video de cap\u00edtulo educativo.<\/p>\n<h2>M\u00e9todo 2: Python re.finditer()<\/h2>\n<p>Tambi\u00e9n puedes contar el n\u00famero de veces que un patr\u00f3n determinado coincide en un texto utilizando el m\u00e9todo <code>re.finditer(pattern, text)<\/code>:<\/p>\n<p><strong>Especificaci\u00f3n<\/strong>: <code>re.finditer(<em>pattern<\/em>, <em>text<\/em>, <em>flags=0<\/em>)<\/code><\/p>\n<p><strong>Definici\u00f3n<\/strong>: devuelve un iterador que repasa todas las coincidencias no solapadas del patr\u00f3n en el texto.<\/p>\n<p>El argumento flags te permite personalizar algunas propiedades avanzadas del motor regex, como por ejemplo si se debe ignorar el uso de may\u00fasculas en los caracteres. Puedes saber m\u00e1s sobre el <a href=\"https:\/\/blog.finxter.com\/python-regex-flags\/\" target=\"_blank\" rel=\"noreferrer noopener\">argumento flags en el tutorial detallado de mi blog<\/a>.<\/p>\n<p><strong>Ejemplo<\/strong>: puedes usar el iterador para contar el n\u00famero de coincidencias. A diferencia del m\u00e9todo <code>re.findall()<\/code> descrito anteriormente, esto tiene la ventaja de que puedes analizar los propios objetos coincidentes que contienen mucha m\u00e1s informaci\u00f3n que la simple subcadena coincidente.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import re\npattern = '[a-z]+'\ntext = 'python is the best programming language in the world'\nfor match in re.finditer(pattern, text): print(match) '''\n&lt;re.Match object; span=(0, 6), match='python'>\n&lt;re.Match object; span=(7, 9), match='is'>\n&lt;re.Match object; span=(10, 13), match='the'>\n&lt;re.Match object; span=(14, 18), match='best'>\n&lt;re.Match object; span=(19, 30), match='programming'>\n&lt;re.Match object; span=(31, 39), match='language'>\n&lt;re.Match object; span=(40, 42), match='in'>\n&lt;re.Match object; span=(43, 46), match='the'>\n&lt;re.Match object; span=(47, 52), match='world'> '''<\/pre>\n<p>Si quieres contar el n\u00famero de coincidencias, puedes utilizar una simple variable count:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import re\npattern = '[a-z]+'\ntext = 'python is the best programming language in the world' count = 0\nfor match in re.finditer(pattern, text): count += 1 print(count)\n# 9<\/pre>\n<p>O una soluci\u00f3n m\u00e1s pit\u00f3nica:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import re\npattern = '[a-z]+'\ntext = 'python is the best programming language in the world' print(len([*re.finditer(pattern, text)]))\n# 9<\/pre>\n<p>Este m\u00e9todo funciona muy bien si no hay coincidencias solapadas. Utiliza el <a href=\"https:\/\/blog.finxter.com\/what-is-asterisk-in-python\/\" target=\"_blank\" rel=\"noreferrer noopener\">operador asterisco<\/a> <code>*<\/code> para desempaquetar todos los valores del iterable.<\/p>\n<h2>M\u00e9todo 3: Coincidencias solapadas<\/h2>\n<p>Los dos m\u00e9todos anteriores funcionan muy bien si no hay <a href=\"https:\/\/blog.finxter.com\/python-regex-match\/\" target=\"_blank\" rel=\"noreferrer noopener\">coincidencias<\/a> solapadas. Si hay coincidencias solapadas, el motor regex simplemente las ignorar\u00e1 porque &#8220;consume&#8221; todas las subcadenas coincidentes y comienza a comparar el siguiente patr\u00f3n s\u00f3lo despu\u00e9s del \u00edndice <code>stop<\/code> de la coincidencia anterior.<\/p>\n<p>As\u00ed que si necesitas encontrar el n\u00famero de coincidencias superpuestas, necesitas usar un enfoque diferente.<\/p>\n<p>La idea es hacer un seguimiento de la posici\u00f3n inicial de la coincidencia precedente e incrementarla en uno despu\u00e9s de cada coincidencia:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import re\npattern = '99'\ntext = '999 ways of writing 99 - 99999' left = 0\ncount = 0\nwhile True: match = re.search(pattern, text[left:]) if not match: break count += 1 left += match.start() + 1\nprint(count)\n# 7 <\/pre>\n<p>Al hacer un seguimiento del \u00edndice start de la coincidencia anterior en la variable left, podemos controlar d\u00f3nde hay que buscar la siguiente coincidencia en la cadena. Ten en cuenta que utilizamos la <a href=\"https:\/\/blog.finxter.com\/introduction-to-slicing-in-python\/\" target=\"_blank\" rel=\"noreferrer noopener\">operaci\u00f3n de rebanado <\/a>de Python <code>text[left:]<\/code> para ignorar todos los caracteres a la izquierda que ya se han considerado en las coincidencias anteriores. En cada iteraci\u00f3n del <a href=\"https:\/\/blog.finxter.com\/python-loops\/\" target=\"_blank\" rel=\"noreferrer noopener\">bucle<\/a>, emparejamos otro patr\u00f3n en el texto. Esto funciona incluso si esas coincidencias se solapan.<\/p>\n<h2>A d\u00f3nde ir desde aqu\u00ed<\/h2>\n<p>Has aprendido tres formas de encontrar el n\u00famero de coincidencias de un patr\u00f3n dado en una cadena.<\/p>\n<p>\u00a1Si tienes problemas con las expresiones regulares, echa un vistazo a nuestro <a href=\"https:\/\/blog.finxter.com\/python-regex\/\" target=\"_blank\" rel=\"noreferrer noopener\">tutorial de regex<\/a> gratuito de 20.000 palabras en el blog de Finxter! \u00a1Te dar\u00e1 <strong>superpoderes de regex<\/strong>!<\/p>\n<p><strong><em>\u00bfQuieres dominar el superpoder regex?<\/em><\/strong> Echa un vistazo a mi nuevo libro <a href=\"https:\/\/blog.finxter.com\/ebook-the-smartest-way-to-learn-python-regex\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong><em>La forma m\u00e1s inteligente de aprender expresiones regulares en Python<\/em><\/strong><\/a> con el innovador enfoque de 3 pasos para el aprendizaje activo: (1) estudia un cap\u00edtulo de libro, (2) resuelve un rompecabezas de c\u00f3digo y (3) mira un video de cap\u00edtulo educativo.<\/p>\n<h2><a href=\"https:\/\/academy.finxter.com\/university\/mastering-regular-expressions\/\" target=\"_blank\" rel=\"noreferrer noopener\">Curso Regex de Python<\/a><\/h2>\n<p><strong><em>Los ingenieros de Google son maestros de expresiones regulares. <\/em><\/strong>El motor de b\u00fasqueda de Google es un <em>motor de procesamiento de texto<\/em> masivo que extrae valor de billones de p\u00e1ginas web.<\/p>\n<p><strong><em>Los ingenieros de Facebook son maestros de expresiones regulares.<\/em><\/strong> Las redes sociales como Facebook, WhatsApp e Instagram conectan a los humanos a trav\u00e9s de <em>mensajes de texto<\/em>.<\/p>\n<p><strong><em>Los ingenieros de Amazon son maestros de expresiones regulares. <\/em><\/strong>Los gigantes del comercio electr\u00f3nico env\u00edan productos basados en <em>descripciones de productos textuales<\/em>.Las expresiones regulares rigen el juego cuando el procesamiento de texto se encuentra con la inform\u00e1tica.&nbsp;<\/p>\n<p><strong><em>Si quieres convertirte tambi\u00e9n en un maestro de expresiones regulares, echa un vistazo al<\/em><\/strong><a href=\"https:\/\/academy.finxter.com\/university\/mastering-regular-expressions\/\"><strong><em> curso de Python regex m\u00e1s completo<\/em><\/strong><\/a><strong><em> del planeta:<\/em><\/strong><\/p>\n<p>\u00bfPor qu\u00e9 Finxter?<\/p>\n<p><em>&#8220;Dadme una palanca lo suficientemente larga [&#8230;] y mover\u00e9 el mundo&#8221;.<\/em> <img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/1f30d.png\" alt=\"\ud83c\udf0d\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> &#8211; <strong>Arqu\u00edmedes<\/strong><\/p>\n<p>\u00a1Finxter pretende ser tu palanca! \u00a1Nuestro \u00fanico prop\u00f3sito es aumentar la <strong><em>inteligencia colectiva<\/em><\/strong> de la humanidad a trav\u00e9s de tutoriales de programaci\u00f3n para que pueda aprovechar la inteligencia computacional infinita para su \u00e9xito! <img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/1f9e0.png\" alt=\"\ud83e\udde0\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<h2>Recursos de aprendizaje<\/h2>\n<p>\u00a1<a href=\"https:\/\/blog.finxter.com\/email-academy\/\">\u00danase a nuestra academia gratuita de correo electr\u00f3nico<\/a> con m\u00e1s de 1000 tutoriales en Python, freelance, ciencia de datos y aprendizaje autom\u00e1tico, y tecnolog\u00eda Blockchain!<\/p>\n<p>Adem\u00e1s, no dude en consultar nuestros <a href=\"https:\/\/blog.finxter.com\/finxter-books\/\" target=\"_blank\" rel=\"noreferrer noopener\">libros de Finxter<\/a> y el <a href=\"https:\/\/blog.finxter.com\/become-python-freelancer-course\/\" target=\"_blank\" rel=\"noreferrer noopener\">curso de freelancer #1 del mundo<\/a> para crear su pr\u00f3spero negocio de codificaci\u00f3n en l\u00ednea. <img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/2b50.png\" alt=\"\u2b50\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/2b50.png\" alt=\"\u2b50\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/2b50.png\" alt=\"\u2b50\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/2b50.png\" alt=\"\u2b50\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/13.1.0\/72x72\/2b50.png\" alt=\"\u2b50\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p><a href=\"https:\/\/blog.finxter.com\/become-python-freelancer-course\/\">Codificador independiente<\/a><\/p>\n<p>Si no est\u00e1s listo para hacerlo, no dudes en leer <a href=\"https:\/\/blog.finxter.com\/full-time-python-freelancer\/\" target=\"_blank\" rel=\"noreferrer noopener\">nuestro art\u00edculo de blog sobre c\u00f3mo ganar tus primeros $ 3,000 como programador freelance<\/a>.<\/p>\n<p><strong>\u00a1TODOS LOS ENLACES DE LA BARRA LATERAL SE ABREN EN UNA NUEVA PESTA\u00d1A!<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para contar un patr\u00f3n de expresi\u00f3n regular varias veces en una cadena dada, usa el m\u00e9todo len(re.findall(pattern, string)) que devuelve el n\u00famero de subcadenas coincidentes o len([*re.finditer(pattern, text)]) que desempaqueta todas las subcadenas coincidentes en una lista y tambi\u00e9n devuelve la longitud de la misma. Hace unas horas, escrib\u00ed una expresi\u00f3n regular en Python que [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[857],"tags":[73,468,528],"class_list":["post-123248","post","type-post","status-publish","format-standard","hentry","category-python-tut","tag-programming","tag-python","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/123248","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/comments?post=123248"}],"version-history":[{"count":0,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/123248\/revisions"}],"wp:attachment":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media?parent=123248"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/categories?post=123248"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/tags?post=123248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}