[Tut] Python Regex – ¿Cómo contar el número de coincidencias? - Printable Version +- Sick Gaming (https://www.sickgaming.net) +-- Forum: Programming (https://www.sickgaming.net/forum-76.html) +--- Forum: Python (https://www.sickgaming.net/forum-83.html) +--- Thread: [Tut] Python Regex – ¿Cómo contar el número de coincidencias? (/thread-99132.html) |
[Tut] Python Regex – ¿Cómo contar el número de coincidencias? - xSicKxBot - 04-04-2022 Python Regex – ¿Cómo contar el número de coincidencias? <div><p class="has-global-color-8-background-color has-background">Para contar un patrón de expresión regular varias veces en una cadena dada, usa el método <code>len(re.findall(pattern, string))</code> que devuelve el número de subcadenas coincidentes o <code>len([*re.finditer(pattern, text)])</code> que desempaqueta todas las subcadenas coincidentes en una lista y también devuelve la longitud de la misma.</p> <p><em>Hace unas horas, escribí una </em><a href="https://blog.finxter.com/python-regex/" target="_blank" rel="noreferrer noopener"><em>expresión regular en Python</em></a><em> que coincidía no una sino varias veces en el texto y me pregunté: </em><strong><em>¿cómo contar el número de coincidencias?</em></strong></p> <p>Considera el ejemplo mínimo en el que buscas un número 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> <p>Puedes ver mi vídeo explicativo a medida que lees el tutorial:</p> <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"> <div class="wp-block-embed__wrapper"> <iframe loading="lazy" title="Python Regex – ¿Cómo contar el número 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> </div> </figure> <p><strong>Artículo relacionado:</strong> <a href="https://blog.finxter.com/python-regex/" target="_blank" rel="noreferrer noopener">Superpoderes Regex de Python – La guía definitiva</a></p> <p>Los ingenieros de Google, Facebook y Amazon son auténticos maestros de expresiones regulares. Si quieres convertirte en uno también, echa un vistazo a nuestro nuevo libro: <a href="https://amzn.to/2Bcw5kK" target="_blank" rel="noreferrer noopener"><strong>La forma más inteligente de aprender Python Regex</strong></a> <em>(Amazon Kindle/Print, se abre en una nueva pestaña)</em>.</p> <p>¿Cuántas coincidencias hay en la cadena? Para contar el número de coincidencias, puede usar varios métodos:</p> <h2>Método 1: Python re.findall()</h2> <p>Usa el <a href="https://blog.finxter.com/python-re-findall/" target="_blank" rel="noreferrer noopener">método <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í hay un ejemplo:</p> <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 >>> pattern = '[a-z]+' >>> text = 'python is the best programming language in the world' >>> len(re.findall(pattern, text)) 9</pre> <p>¿Por qué es 9 el resultado? Debido a que hay nueve subcadenas coincidentes en la lista devuelta por el método <code>re.findall()</code>:</p> <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) ['python', 'is', 'the', 'best', 'programming', 'language', 'in', 'the', 'world']</pre> <p>Este método funciona muy bien si no hay coincidencias solapadas.</p> <p><strong><em>¿Quieres 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ás 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ítulo de libro, (2) resuelve un rompecabezas de código y (3) mira un video de capítulo educativo.</p> <h2>Método 2: Python re.finditer()</h2> <p>También puedes contar el número de veces que un patrón determinado coincide en un texto utilizando el método <code>re.finditer(pattern, text)</code>:</p> <p><strong>Especificación</strong>: <code>re.finditer(<em>pattern</em>, <em>text</em>, <em>flags=0</em>)</code></p> <p><strong>Definición</strong>: devuelve un iterador que repasa todas las coincidencias no solapadas del patrón en el texto.</p> <p>El argumento flags te permite personalizar algunas propiedades avanzadas del motor regex, como por ejemplo si se debe ignorar el uso de mayúsculas en los caracteres. Puedes saber más 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> <p><strong>Ejemplo</strong>: puedes usar el iterador para contar el número de coincidencias. A diferencia del método <code>re.findall()</code> descrito anteriormente, esto tiene la ventaja de que puedes analizar los propios objetos coincidentes que contienen mucha más información que la simple subcadena coincidente.</p> <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 pattern = '[a-z]+' text = 'python is the best programming language in the world' for match in re.finditer(pattern, text): print(match) ''' <re.Match object; span=(0, 6), match='python'> <re.Match object; span=(7, 9), match='is'> <re.Match object; span=(10, 13), match='the'> <re.Match object; span=(14, 18), match='best'> <re.Match object; span=(19, 30), match='programming'> <re.Match object; span=(31, 39), match='language'> <re.Match object; span=(40, 42), match='in'> <re.Match object; span=(43, 46), match='the'> <re.Match object; span=(47, 52), match='world'> '''</pre> <p>Si quieres contar el número de coincidencias, puedes utilizar una simple variable count:</p> <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 pattern = '[a-z]+' text = 'python is the best programming language in the world' count = 0 for match in re.finditer(pattern, text): count += 1 print(count) # 9</pre> <p>O una solución más pitónica:</p> <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 pattern = '[a-z]+' text = 'python is the best programming language in the world' print(len([*re.finditer(pattern, text)])) # 9</pre> <p>Este método 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> <h2>Método 3: Coincidencias solapadas</h2> <p>Los dos métodos 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á porque “consume” todas las subcadenas coincidentes y comienza a comparar el siguiente patrón sólo después del índice <code>stop</code> de la coincidencia anterior.</p> <p>Así que si necesitas encontrar el número de coincidencias superpuestas, necesitas usar un enfoque diferente.</p> <p>La idea es hacer un seguimiento de la posición inicial de la coincidencia precedente e incrementarla en uno después de cada coincidencia:</p> <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 pattern = '99' text = '999 ways of writing 99 - 99999' left = 0 count = 0 while True: match = re.search(pattern, text[left:]) if not match: break count += 1 left += match.start() + 1 print(count) # 7 </pre> <p>Al hacer un seguimiento del índice start de la coincidencia anterior en la variable left, podemos controlar dónde 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ón 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ón del <a href="https://blog.finxter.com/python-loops/" target="_blank" rel="noreferrer noopener">bucle</a>, emparejamos otro patrón en el texto. Esto funciona incluso si esas coincidencias se solapan.</p> <h2>A dónde ir desde aquí</h2> <p>Has aprendido tres formas de encontrar el número de coincidencias de un patrón dado en una cadena.</p> <p>¡Si 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! ¡Te dará <strong>superpoderes de regex</strong>!</p> <p><strong><em>¿Quieres 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ás 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ítulo de libro, (2) resuelve un rompecabezas de código y (3) mira un video de capítulo educativo.</p> <h2><a href="https://academy.finxter.com/university/mastering-regular-expressions/" target="_blank" rel="noreferrer noopener">Curso Regex de Python</a></h2> <p><strong><em>Los ingenieros de Google son maestros de expresiones regulares. </em></strong>El motor de búsqueda de Google es un <em>motor de procesamiento de texto</em> masivo que extrae valor de billones de páginas web.</p> <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és de <em>mensajes de texto</em>.</p> <p><strong><em>Los ingenieros de Amazon son maestros de expresiones regulares. </em></strong>Los gigantes del comercio electrónico envían 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ática. </p> <p><strong><em>Si quieres convertirte también 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ás completo</em></strong></a><strong><em> del planeta:</em></strong></p> <p>¿Por qué Finxter?</p> <p><em>“Dadme una palanca lo suficientemente larga […] y moveré el mundo”.</em> <img src="https://s.w.org/images/core/emoji/13.1.0/72x72/1f30d.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /> – <strong>Arquímedes</strong></p> <p>¡Finxter pretende ser tu palanca! ¡Nuestro único propósito es aumentar la <strong><em>inteligencia colectiva</em></strong> de la humanidad a través de tutoriales de programación para que pueda aprovechar la inteligencia computacional infinita para su éxito! <img src="https://s.w.org/images/core/emoji/13.1.0/72x72/1f9e0.png" alt="?" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p> <h2>Recursos de aprendizaje</h2> <p>¡<a href="https://blog.finxter.com/email-academy/">Únase a nuestra academia gratuita de correo electrónico</a> con más de 1000 tutoriales en Python, freelance, ciencia de datos y aprendizaje automático, y tecnología Blockchain!</p> <p>Además, 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óspero negocio de codificación en línea. <img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/13.1.0/72x72/2b50.png" alt="⭐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p> <p><a href="https://blog.finxter.com/become-python-freelancer-course/">Codificador independiente</a></p> <p>Si no estás listo para hacerlo, no dudes en leer <a href="https://blog.finxter.com/full-time-python-freelancer/" target="_blank" rel="noreferrer noopener">nuestro artículo de blog sobre cómo ganar tus primeros $ 3,000 como programador freelance</a>.</p> <p><strong>¡TODOS LOS ENLACES DE LA BARRA LATERAL SE ABREN EN UNA NUEVA PESTAÑA!</strong></p> </div> https://www.sickgaming.net/blog/2022/03/24/python-regex-como-contar-el-numero-de-coincidencias/ |