La funcionalidad sscanf() en Python

Abid Ullah 10 octubre 2023
La funcionalidad sscanf() en Python

La función sscanf() es del lenguaje de programación C y C++. Si bien Python no ofrece ningún método o biblioteca equivalente exacto para este método, puede haber otras formas de ejecutar esta funcionalidad.

Este artículo de Python le ayudará a comprender mejor lo que sscanf() tiene para ofrecer y cómo podemos imitarlo en un script de Python.

la funcionalidad sscanf() en Python

El método sscanf() extrae una cadena de una cadena ya proporcionada. Así es como declaramos el método:

int sscanf(const char *str, const char *format, ...)

Este método esencialmente leerá la entrada formateada de una cadena y, a diferencia de scanf(), los datos de sscanf() se leen de una cadena en lugar de una consola. Los datos se leen del búfer y se introducen en las direcciones de ubicación proporcionadas como argumentos en la declaración del método.

Cada argumento proporcionado apunta a una variable con el mismo tipo que la cadena de formato. El método devuelve los valores que se convirtieron y asignaron correctamente.

No hay bibliotecas o módulos equivalentes directos para sscanf() en Python. Sin embargo, hay dos formas de imitar la funcionalidad.

Usar expresiones regulares de la biblioteca re

Una expresión regular ayuda a especificar el formato de una cadena o describe el formato de una cadena, que luego se puede usar para validar una cadena diferente. Una expresión regular puede contener tanto caracteres especiales como ordinarios.

Caracteres como A, B, b o 0 son buenos ejemplos de los caracteres ordinarios más simples en una expresión. La biblioteca también puede buscar caracteres específicos en una cadena o una lista de caracteres en un orden particular.

Mire el script de ejemplo a continuación que busca la cadena def en una cadena proporcionada.

Código de ejemplo:

import re

m = re.search("(?<=abc)def", "abcdef")
m.group(0)

El programa devuelve def como salida.

También es posible buscar cadenas dentro de cadenas separadas por caracteres especiales. Por ejemplo, en el script a continuación, buscamos la palabra proporcionada después de un guión:

Código de ejemplo:

m = re.search(r"(?<=-)\w+", "spam-emails")
m.group(0)

La salida para esto es correos electrónicos. ¡Las posibilidades de analizar con re son infinitas!

Otra biblioteca similar a re es regex, que es compatible con API. Regex es retrocompatible con re y viene con funcionalidades adicionales.

A continuación se muestra una prueba de patrón condicional posible con un módulo regex. Por supuesto, necesitaremos importar la biblioteca antes de ejecutar esto.

Código de ejemplo:

>>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
<regex.Match object; span=(0, 3), match='123'>
>>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
<regex.Match object; span=(0, 6), match='abc123'>

Utilice la biblioteca de neuronas

La biblioteca neuron (no de Python en sí) también se puede usar para importar sscanf() en un script de Python. Por ejemplo, si tuviéramos que ejecutar el siguiente script,

from neuron import h

x = h.ref(0)
h.sscanf("0.3", "%f", x)
print(x[0])

La salida resultante sería 0.300000011921.

Aquí hay algunos ejemplos más que podemos revisar para comprender el uso de sscanf() en Python a través de la biblioteca neuron, con los resultados de cada línea agregados como un comentario.

Código de ejemplo:

from neuron import h as hoc

string = hoc.ref("")
range_list = [hoc.ref(0) for i in range(50)]
hoc.sscanf("This is a test\n", "%s", string)
print(string[0])
hoc.sscanf("This is a test\n", "%[^\n]", string)
print(string[0])
hoc.sscanf("This is a test\n", "%*s%s", string)
print(string[0])
hoc.sscanf(
    "1 2 3 4 5 6 7 8 9 10",
    "%f%f%f%f%f%f%f%f%f%f%f",
    range_list[0],
    range_list[1],
    range_list[2],
    range_list[3],
    range_list[4],
    range_list[5],
    range_list[6],
    range_list[7],
    range_list[8],
    range_list[9],
    range_list[10],
    range_list[11],
    range_list[12],
)
print("Should only have non-zero values for range_list indices 0 - 9")
for i in range(13):
    print("%d %g" % (i, range_list[i][0]))

Como se puede observar en las dos opciones descritas anteriormente, podemos usar cualquiera de las bibliotecas según el escenario. Python es un lenguaje extenso, de escritura rápida y hermoso que nos ofrece una amplia gama de opciones para analizar cadenas de una manera que suele ser exclusiva de Python.

Las bibliotecas re y regex son ejemplos de la inmensidad del lenguaje.

Esperamos que este artículo le resulte útil para comprender el concepto básico de la función sscanf() utilizada en Python.

Autor: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn