Como dividir as strings com base em múltiplos Delimitadores em Python
Python string split()
método permite que uma string seja facilmente dividida em uma lista com base em um delimitador. Embora, em alguns casos, você possa precisar que a separação ocorra com base não apenas em um, mas em múltiplos valores de delimitadores. Este rápido artigo introduz duas abordagens convenientes que podem ser alcançadas em Python.
Fio Dividido com Dois Delimitadores em Python
Assumir a seqüência a seguir.
text = "python is, an easy;language; to, learn."
Para nosso exemplo, precisamos dividi-lo ou por um ponto-e-vírgula seguido por um espaço ;
, ou por uma vírgula seguida por um espaço ,
. Neste caso, qualquer ocorrência de ponto-e-vírgula ou vírgula singular, ou seja, ,
, ;
sem espaços de arrasto, não deve ser preocupada.
Expressões regulares
Embora o uso de expressões regulares seja frequentemente desaprovado devido à sua natureza bastante cara quando se trata de análise de string, pode ser garantido com segurança em uma situação como esta.
Usar Expressão Básica
O módulo Python integrado re
tem um método split()
que podemos utilizar para este caso.
Vamos utilizar uma expressão básica a ou b regular (a|b
) para separar nossos múltiplos delimitadores.
import re
text = "python is, an easy;language; to, learn."
print(re.split("; |, ", text))
Resultado:
['python is', 'an easy;language', 'to', 'learn.']
Como mencionado na página Wikipedia, Expressões regulares utilizam o IEEE POSIX como padrão para sua sintaxe. Ao nos referirmos a esta norma, podemos administrar várias formas adicionais de escrever uma expressão regular que corresponda a nosso caso de uso.
Em vez de utilizar separadores de barras (|
) para definir nossos delimitadores, podemos alcançar o mesmo resultado utilizando a sintaxe Range ([]
) fornecida nas Expressões Regulares. Você pode definir um intervalo de caracteres que uma expressão regular pode combinar, fornecendo-os entre parênteses rectos.
Portanto, ao especificar o padrão de nossa expressão regular, podemos simplesmente fornecer um ponto-e-vírgula e uma vírgula dentro de colchetes e um espaço adicional [;,]
que resultaria na combinação da expressão regular por partes de uma string com exatamente [um ponto-e-vírgula OU uma vírgula] e um espaço de fuga.
import re
text = "python is, an easy;language; to, learn."
print(re.split("[;,] ", text))
Faça disso uma função
A expressão básica mencionada anteriormente estava limitada a um array de separadores codificados. Isto pode mais tarde levar a aborrecimentos quando modificações de delimitadores ocorrem e também limita sua reusabilidade em outras partes do código. Portanto, é melhor em termos de utilização das melhores práticas considerar tornar o código mais genérico e reutilizável. Portanto, vamos codificar essa lógica para uma função Python apenas para estar do nosso lado seguro.
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 funções de String
Caso você queira se abster de utilizar Expressões Regulares ou não precise introduzir novos módulos ao projeto apenas para dividir uma string, você pode utilizar os métodos replace()
e split()
presentes no próprio módulo de string, de uma maneira meio hacky para alcançar o mesmo 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(", "))
Aqui primeiro, substituímos todas as ocorrências de um ponto-e-vírgula seguido por um espaço (; )
dentro da string por nosso outro delimitador que é uma vírgula seguida por um espaço (, )
. Desta forma, podemos limitar a divisão da string a apenas um delimitador, que é uma vírgula seguida de um espaço (, )
neste caso.
Agora podemos dividir com segurança essa string modificada utilizando a função simples split()
fornecida pelo módulo de string Python para trazer o mesmo resultado.
Note que não importamos nenhum módulo novo para o código desta vez para alcançar o resultado.
Fio Dividido com Delimitadores Múltiplos em Python
Considere o texto mencionado abaixo.
text = "python is# an% easy;language- to, learn."
Para este exemplo, precisamos dividi-lo em todas as instâncias o texto tem qualquer um dos caracteres # % ; - ,
seguido de um espaço.
Expressões regulares
Neste caso, podemos acrescentar facilmente os separadores adicionais ao definir nossa expressão regular.
import re
text = "python is# an% easy;language- to, learn."
print(re.split("; |, |# |% |- ", text))
Resultado:
['python is', 'an', 'easy;language', 'to', 'learn.']
como uma função
Também nesta situação, podemos simplesmente utilizar o mesmo código que utilizamos anteriormente com dois delimitadores com uma simples mudança de adicionar todos os separadores adicionais na variável separators
.
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))
Utilize as funções String
Semelhante à forma como lidamos com ele antes com dois delimitadores, podemos utilizar replace()
e split()
funções para lidar com isso também.
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(", "))
Resultado:
['python is', 'an easy;language', 'to', 'learn.']
Deve-se observar que este método não é recomendado quando utilizado para contas de delimitadores superiores, como neste caso. Uma vez que neste caso o método de string replace()
terá que ser utilizado várias vezes para fazer múltiplas travessias na string, ele acabaria por causar picos de desempenho indesejados facilmente evitáveis utilizando Expressões Regulares.