¿Cuál es la manera más rápida de contar la cantidad de veces que una determinada cuerda aparece en una más grande? Mi mejor opción sería reemplazar todas las instancias de esa cadena con nada, calcular la diferencia de longitudes y dividir por la longitud de la subcadena, pero parece bastante lento, y necesito analizar grandes cantidades de datos.Contando el número de ocurrencias de una cadena dentro de otra (Perl)
Respuesta
Puede capturar las cadenas, y luego contarlas. Se puede hacer mediante la aplicación de un contexto de lista para la captura con ()
:
my $x = "foo";
my $y = "foo foo foo bar";
my $c =() = $y =~ /$x/g; # $c is now 3
También puede capturar a una matriz y contar la matriz. El mismo principio, técnica diferente:
my @c = $y =~ /$x/g;
my $count = @c;
¡Gracias! Es muy parecido a la segunda solución. – ronash
@ronash Es la misma solución. Uno usa una variable de temperatura, el otro no. También puede hacer 'my $ count = @c = $ y = ~/$ x/g', pero en su lugar puede simplemente ignorar' @ c' y usar '()'. Que es lo mejor, si no te importan las partidas reales. – TLP
Esto no funciona si '$ x' contiene ciertos caracteres reverb, ya que' $ x' se interpreta como una expresión regular. Agrega '\ Q' para arreglar esto, ej. '/ \ Q $ x/g'. Ver 'quotemeta' para más información. – tuomassalo
Puede usar una expresión regular global. Algo como:
my @matches = $bigstring =~ /($littlestring)/g;
my $count = @matches;
Parece la solución más simple, así que creo que la usaré, a menos que haya una más rápida. ¡Gracias! – ronash
No estoy seguro de la velocidad de la expresión regular, pero estoy seguro de que el solo hecho de usar las operaciones de coincidencia es más rápido que las sustituciones. Y no puedo pensar en una solución que no tenga algo que ver con regex (¡será muy interesante ver lo contrario!) – MattLBeck
my $string = "aaaabbabbba";
my @count = ($string =~ /a/g);
print @count . "\n";
o
my $count = ($string =~ s/a/a/g);
simplemente para la corrección puede llamar repetidamente la función de índice en un bucle y contar todas las veces que devuelve el índice de la subcadena en la cuerda, y cambie la posición de inicio. Eso evitaría el uso de expresiones regulares, y en mis pruebas es un poco más rápido que las soluciones de expresiones regulares.
He adaptado un sub hacerlo desde aquí: http://www.misc-perl-info.com/perl-index.html
sub occurrences {
my($x, $y) = @_;
my $pos = 0;
my $matches = 0;
while (1) {
$pos = index($y, $x, $pos);
last if($pos < 0);
$matches++;
$pos++;
}
return $matches;
}
- 1. contando el número de ocurrencias de cadena
- 2. Obteniendo el número de ocurrencias de una cadena en otra cadena
- 3. Cuenta de PHP de ocurrencias de caracteres de una cadena dentro de otra cadena
- 4. Contando el número de puntos en una cadena
- 5. Contando el número de ocurrencias de cada elemento en una lista
- 6. Contando el número de palabras en C#
- 7. Contando las ocurrencias de distintas columnas múltiples en SQL
- 8. Perl: ordenar caracteres dentro de una cadena
- 9. Contando el número de consultas realizadas
- 10. contando el número de líneas en un archivo de texto
- 11. contar cuántas veces aparece una cadena dentro de otra cadena
- 12. Encuentra una cadena dentro de otra cadena, buscar hacia atrás
- 13. ¿Cómo insertar una cadena dentro de otra cadena?
- 14. Cuenta el número de ocurrencias de un carácter en una cadena
- 15. Cómo encontrar el número de ocurrencias de Slash desde una cadena
- 16. ¿Cuenta el número de ocurrencias de una cadena en un campo VARCHAR?
- 17. Contando el número de banderas establecidas en una enumeración
- 18. contando el número de entradas vacías con una cierta clase
- 19. Contando el número de archivos en una unidad
- 20. reemplazar todas las ocurrencias de una cadena
- 21. Contando elementos de matriz en Perl
- 22. php - reemplazar ocurrencias de cadena
- 23. Reemplazar todas cadena de ocurrencias
- 24. ¿Cómo encontrar índices de todas las ocurrencias de una cadena en otra en JavaScript?
- 25. Contar el número de veces que aparece una cadena dentro de una cadena
- 26. Cuente las ocurrencias de caracteres en una cadena
- 27. ¿Cómo extraer un número de una cadena en Perl?
- 28. En C++, ¿cuál es la manera más rápida de reemplazar todas las ocurrencias de una subcadena dentro de una cadena con otra cadena?
- 29. C# Añada x ocurrencias de un carácter a una cadena
- 30. Usar el recuento para encontrar el número de ocurrencias
posible que desee comprobar esto ... aunque es a partir de 1999, y hay muy probablemente otras maneras de hacer este tipo de cosas eficientemente: http://www.perlmonks.org/?node=How%20can%20I%20count%20the%20number%20of%20occurrences%20of%20a%20substring%20within%20a%20string%3F – summea
'perldoc -q count ' – toolic
¿Pueden superponerse? – tchrist