Recuento de cadenas con apariciones superpuestas [cerrado]

Resuelto calccrypto asked hace 14 años • 25 respuestas

¿Cuál es la mejor manera de contar el número de apariciones de una cadena determinada, incluida la superposición en Python? Esta es una manera:

def function(string, str_to_search_for):
      count = 0
      for x in xrange(len(string) - len(str_to_search_for) + 1):
           if string[x:x+len(str_to_search_for)] == str_to_search_for:
                count += 1
      return count


function('1011101111','11')

Este método devuelve 5.

¿Existe una mejor manera en Python?

calccrypto avatar Jun 04 '10 06:06 calccrypto
Aceptado

Bueno, esto podría ser más rápido ya que realiza la comparación en C:

def occurrences(string, sub):
    count = start = 0
    while True:
        start = string.find(sub, start) + 1
        if start > 0:
            count+=1
        else:
            return count
Jochen Ritzel avatar Jun 03 '2010 23:06 Jochen Ritzel
>>> import re
>>> text = '1011101111'
>>> len(re.findall('(?=11)', text))
5

Si no quisieras cargar la lista completa de coincidencias en la memoria, ¡nunca sería un problema! Podrías hacer esto si realmente quisieras:

>>> sum(1 for _ in re.finditer('(?=11)', text))
5

Como función ( re.escapese asegura de que la subcadena no interfiera con la expresión regular):

def occurrences(text, sub):
    return len(re.findall('(?={0})'.format(re.escape(sub)), text))
>>> occurrences(text, '11')
5
jamylak avatar Jul 29 '2012 02:07 jamylak

También puedes intentar usar el nuevo módulo de expresiones regulares de Python , que admite coincidencias superpuestas.

import regex as re

def count_overlapping(text, search_for):
    return len(re.findall(search_for, text, overlapped=True))

count_overlapping('1011101111','11')  # 5
David C avatar Aug 25 '2016 22:08 David C

Python str.countcuenta subcadenas que no se superponen:

In [3]: "ababa".count("aba")
Out[3]: 1

Aquí hay algunas formas de contar secuencias superpuestas, estoy seguro de que hay muchas más :)

Expresiones regulares anticipadas

¿Cómo encontrar coincidencias superpuestas con una expresión regular?

In [10]: re.findall("a(?=ba)", "ababa")
Out[10]: ['a', 'a']

Generar todas las subcadenas

In [11]: data = "ababa"
In [17]: sum(1 for i in range(len(data)) if data.startswith("aba", i))
Out[17]: 2
Dima Tisnek avatar Jan 14 '2016 08:01 Dima Tisnek