Cómo dividir cadenas basadas en múltiples delimitadores en Python

Dasun Nirmitha 30 enero 2023
  1. Python Split String con dos delimitadores
  2. Cadena dividida de Python con múltiples delimitadores
Cómo dividir cadenas basadas en múltiples delimitadores en Python

El método Python string split() permite que una cadena se divida fácilmente en una lista basada en un delimitador. Aunque en algunos casos, es posible que necesite la separación en función de no solo uno sino múltiples valores delimitadores. Este artículo rápido de 101 presenta dos enfoques convenientes que esto se puede lograr en Python.

Python Split String con dos delimitadores

Asume la siguiente cadena.

text = "python is, an easy;language; to, learn."

Para nuestro ejemplo, necesitamos dividirlo por un punto y coma seguido de un espacio ; , o por una coma seguida de un espacio , . En este caso, cualquier ocurrencia de punto y coma o comas singulares, es decir, ,, ; sin espacios finales no debería preocuparse.

Expresiones regulares

Aunque el uso de expresiones regulares a menudo está mal visto debido a su naturaleza bastante costosa cuando se trata del análisis de cadenas, puede garantizarse de manera segura en una situación como esta.

Usando la expresión básica

El módulo incorporado re de Python tiene un método split() que podemos usar para este caso.

Usemos una expresión regular básica aob (a|b) para separar nuestros delimitadores múltiples.

import re

text = "python is, an easy;language; to, learn."
print(re.split("; |, ", text))

Resultado:

['python is', 'an easy;language', 'to', 'learn.']

Como se menciona en la página de Wikipedia, las expresiones regulares usan IEEE POSIX como el estándar para su sintaxis. Al referirnos a este estándar, podemos administrar varias formas adicionales de escribir una expresión regular que coincida con nuestro caso de uso.

En lugar de usar separadores de barra (|) para definir nuestros delimitadores, podemos lograr el mismo resultado usando la sintaxis de Rango ([]) proporcionada en Expresiones regulares. Puede definir un rango de caracteres que puede coincidir con una expresión regular proporcionándolos entre corchetes.

Por lo tanto, al especificar el patrón de nuestra expresión regular, simplemente podemos proporcionar un punto y coma y una coma entre corchetes y un espacio adicional [;,] que daría como resultado que la expresión regular coincida con partes de una cadena con exactamente [un punto y coma. O coma] y un espacio final.

import re

text = "python is, an easy;language; to, learn."
print(re.split("[;,] ", text))

Hazlo una función

La expresión básica mencionada anteriormente se limitaba a un conjunto de separadores codificados. Más tarde, esto puede generar problemas cuando se producen modificaciones del delimitador y también limita su reutilización en otras partes del código. Por lo tanto, es mejor en términos de uso de las mejores prácticas considerar hacer que el código sea más genérico y reutilizable. Por lo tanto, codifiquemos esa lógica en una función de Python solo para estar seguros.

import re

text = "python is, an easy;language; to, learn."
separators = "; ", ", "


def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = "|".join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)


print(custom_split(separators, text))

Usar funciones de cadena

En caso de que desee abstenerse de usar Expresiones regulares o no necesite introducir nuevos módulos al proyecto solo por dividir una cadena, puede usar replace() y split() métodos presentes en el módulo de cadena en sí mismo de una manera hacky para lograr el mismo resultado.

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("; ", ", ")

print(text_one_delimiter.split(", "))

En primer lugar, reemplazamos todas las apariciones de un punto y coma seguido de un espacio (; ) dentro de la cadena con nuestro otro delimitador que es una coma seguida de un espacio (, ). De esta forma, podemos limitar la división de cadenas a un solo delimitador, que es una coma seguida de un espacio (, ) en este caso.

Ahora podemos dividir esa cadena modificada de forma segura utilizando la función simple split() proporcionada por el módulo de cadena Python para obtener el mismo resultado.

Tenga en cuenta que esta vez no hemos importado ningún módulo nuevo al código para lograr el resultado.

Cadena dividida de Python con múltiples delimitadores

Considere el texto mencionado a continuación.

text = "python is# an% easy;language- to, learn."

Para este ejemplo, necesitamos dividirlo en todas las instancias en que el texto tenga cualquiera de los caracteres # % ; - , seguido de un espacio.

Expresiones regulares

En este caso, podemos agregar fácilmente los separadores adicionales al definir nuestra expresión regular.

import re

text = "python is# an% easy;language- to, learn."
print(re.split("; |, |# |% |- ", text))

Resultado:

['python is', 'an', 'easy;language', 'to', 'learn.']

Como una función

También en esta situación, simplemente podemos usar el mismo código que usamos anteriormente con dos delimitadores con un simple cambio de agregar todos los separadores adicionales a la variable separadores.

import re

text = "python is# an% easy;language- to, learn."
separators = "; ", ", ", "# ", "% ", "- "


def custom_split(sepr_list, str_to_split):
    # create regular expression dynamically
    regular_exp = "|".join(map(re.escape, sepr_list))
    return re.split(regular_exp, str_to_split)


print(custom_split(separators, text))

Usar funciones de cadena

Similar a la forma en que lo tratamos antes con dos delimitadores, podemos usar replace() y split() funciona para tratar esto también.

text = "python is, an easy;language; to, learn."

# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = (
    text.replace("# ", ", ").replace("% ", ", ").replace("; ", ", ").replace("- ", ", ")
)

print(text_one_delimiter.split(", "))

Producción :

['python is', 'an easy;language', 'to', 'learn.']

Cabe señalar que este método no se recomienda cuando se utiliza para conteos de delimitadores más altos, como en este caso. Dado que en este caso el método replace() de cadena tendrá que usarse varias veces para hacer múltiples recorridos en la cadena, en última instancia, causaría picos de rendimiento no deseados fácilmente evitables usando Expresiones regulares.

Artículo relacionado - Python String